Я люблю, когда все работает. Когда не работает — не люблю. Восемь лет назад я начал писать диссертацию по деформативному моделированию и одновременно искать себе такой инструмент, чтобы работал. Я всего лишь искал что-то такое, что могло бы превращать идеи в картинки. Оказалось, это совсем не тривиально.
После некоторых безуспешных попыток найти идеал, остановиться пришлось на Python + TkInter. Главное достоинство этой связки — как минимум на Windows она ставится из коробки и не капризничает. Это важно, когда заниматься приходится при каждой удобной возможности: в институте, на работе, дома, у родителей. В остальном она, конечно, не очень удобная, хотя в целом для того, чтобы посмотреть результат вычислительного эксперимента глазами, годится.
Но вот иногда, увы довольно нечасто, вычислительный эксперимент дает такие результаты, такую картинку, которой хочется поделиться. Иногда таких картинок не одна и не только картинки представляют интерес. Еще и какие-то измерения, стартовые коэффициенты, числовые результаты, в общем, — текст и таблицы вместе. Приходится снимать картинку скриншотом, вставлять в какой-нибудь док, туда же копировать текст из консоли и так далее. Не так уж проблематично, но хотелось бы, чтобы конечный файл «для поделиться» формировался автомтически.
К сожалению, простое и рабочее решение пришло в голову уже сильно позже защиты. Растровая картинка — это фактически матрица цветов. Матрицы в чистом Питоне — это вложенные массивы. А вот, например, в HTML — таблицы. Можно сгенерировать таблицу с ячейками размерами в один пиксель и каждой ячейке присвоить соответствующий цвет фона. Потом это все можно вставить в любой HTML вместе с текстом и нормальными таблицами.
Вот, собственно, готовый модуль, который и делает картинки таблицами: https://github.com/akalenuk/html_bitmap Кроме конвертации массива с цветами в HTML, он еще позволяет немного на этой таблице рисовать прямоугольники, прямые и окружности.
Конечно, если цвет присваивать буквально каждой ячейке, таблица окажется незаслуженно левиафанской. Поэтому тут используется несложный оптимизирующий алгоритм. Цвет присваивается не ячейкам, а прямоугольникам из объединенных ячеек. И вот так уже получается не так плохо.
Например, картика из теста самого модуля, та что сверху статьи, занимает около 260 KB. Сжатая зипом с нормальным уровнем компрессии — 19 KB.
Для сравнения, та же картинка в несжатом BMP занимает более 500 KB, в 256-цветном GIF — 65 KB, в PNG — те же 19 KB.
И не то что бы это серьезно кого-то волновало в двадцать первом веке.
Да, это тупое решение с массой недостатков, но оно позволяет сконцентрироваться на исследовании, а не на установке matplotlib на каждой машине и не на конвертации, к примеру, .odt в .docx. Самое главное достоинство такого подхода — текст и картинка получается в одном таком файле, который можно переслать кому угодно, и получатель сможет его открыть безо всяких проблем несовместимости. Даже криво собранный HTML любой современный браузер подхватит и как-то да выведет. Оно просто работает.
Автор: akalenuk