Салимóненко Дмитрий Александрович
Разное
Т.е. для изменения их размеров (resize). Мне нередко требуется создавать свои иконки - рисунки-значки, фавиконки. Т.е. рисунки небольшого размера. Длительное время я для этой цели пользовался графическими редакторами. Вроде бы, логично. Однако, все те, что мне доступны, делают масштабирование достаточно отвратительно. Это, в частности, GIMP, Microsoft Paint, Paint.net, Hornil. Есть, конечно и онлайн-сервисы, один из них я проверил (Fotor) - качество масштабирования примерно аналогичное. Можно, конечно, и дальше перебирать графические редакторы один за другим. Ну, а также можно убедить себя, что "при масштабировании растровых изображений неизбежно теряется качество". Да, можно убедить (как это делают в интернет-форумах, убеждая в этом друг друга) и так и ходить, как говорится. Однако, ни то, ни другое мне не нужно.
Практически все (вроде бы), кому надо, берут что-то готовое. Ну, или рисуют "такое", что аж смотреть противно. Вот, скажем, образец отвратительности от графического редактора Hornul. Ну, что там разберешь? Какие-то квадратики, что-то типа глистов и вовсе линии непонятного назначения. Производители этого редактора, конечно, из... ммм... Южной Кореи. Но, тем не менее. Уж что, нельзя было сделать пару десятков качественных пиктограмм? Даже GIMP и то в этом плане гораздо лучше.
Для сравнения, чтобы было понятно, почему именно Я этим озаботился. Вот примеры моих личных интерфейсов, это чисто для себя. Просто для информации, на всякий случай. Для ясности. Это - из моего графического WYSIVYG-редактора. В нем, кстати, и набираю эту статью. Очень, очень удобно. И быстро.
А вот еще пример интерфейса - ну, для общих задач, в том числе, для включения этого редактора. Можно бы и продолжить, ну, да неохота. Кто читает статью - можете сравнить мои дизайны... ну, и многие другие. Например, у того же Hornil. Или PHPStorm (там тоже примитивный дизайн).
Кому как, но мне нужно, чтобы было красиво и приятно смотреть. А кого-то, да, вполне устроят изображения типа глистов (или фекалий) и чего-то подобного. Лично мне это не нужно.

Вот в Paint еще более-менее. Я бы даже сказал - хорошо.
Чтобы подобрать (для себя) требуемую иконку или сделать ее, да, уходит время. И проблема усугубляется еще и тем, что у меня НЕТ ни художественных, ни дизайнерских способностей. Увы. Поэтому приходится просматривать кучу готовых и/или как-то комбинировать их, формировать именно то, что нужно. Поэтому масштабирование (resize) для меня бывает очень актуально.
Заказывать?... Ну, едва ли человек нарисует именно так, как надо МНЕ. Лучше уж сделать самому.
Как быть?
Сколько-то лет я мирился с "неизбежной" потерей качества. Если говорить об увеличении размеров (ширины и высоты) изображения, то тут, да, качество будет, как правило, снижаться. Однако, почему оно должно снижаться при СНИЖЕНИИ размеров изображения? Ахинея ведь. Даже взять GIMP (каждый раз НЕдобрым словом поминаю его создателей). Там пока уменьшаешь размеры, рисунок (или его часть) масштабируется очень даже качественно. НО - это демо-режим, лишь для показа. А когда нажимаешь кнопку "Изменить размер" (или что-то подобное), то качество масштабированного изображения просто резко падает. Понятно, что разработчики GIMP специально сделали это. Зачем? Ну, GIMP - это бесплатный редактор. Поэтому они (видимо, умышленно) ограничили качество. Ну, сами посудите, по скриншоту. После масштабирования примерно в 3 раза вначале качество было очень даже неплохим, но потом, после подтверждения этой операции, оно заметно снизилось. Мутность появилась, да и красная стрелка стала заметно хуже (точнее, отвратительной). Грани фигур стали гораздо менее ровными. В общем, такое себе.

Теоретически, возможно, что там есть какая-нибудь настройка, которая предотвращает потерю качества. Но, я как ни искал, не нашел. Спрашивал совета - молчок. Остается предположить, что это разработчики GIMP сделали, типа, для развлечения в виде издевательств над пользователями. И, судя по информации в интернете на форумах, такое не лечится.
В других редакторах (из состава перечисленных)- не намного лучше. Вот как получилось в Paint:

Вот результат из Paint.NET:

Hornil:

Видимо, так разные графические редакторы можно перебирать бесконечно.
Вполне возможно, что в каком-нибудь Photoshope качество масштабирования будет гораздо лучше. Но, этим я пользоваться не хочу, из принципиальных соображений. Я ничем не пользуюсь от Adobe, за исключением просмотрщика PDF-файлов (Adobe Reader). Ну, и самими PDF-файлами тоже пользуюсь. Больше - ничем.
Ну, или при помощи искусственного интеллекта.
Выход - в использовании PHP
Это, конечно, не С/С++. Но, зато довольно удобно делать и сравнительно быстро (по сравнению с С/С++).
В общем, решил я вначале использовать штатные средства языка РНР для масштабирования. Результат - не очень. Ну, получше, чем в GIMP/Paint, но все равно не очень.
Тут я вспомнил о программе imagick. Есть для нее соответствующее расширение в PHP. Сделал по-быстрому небольшой программный код, испытал... как-то тоже не очень. Ну, вот, подумалось. И зачем тогда это расширение-то сделали? Да там еще около сотни разных методов, пойди их разбери...
А потом (на stackoverflow.com) смотрю-читаю, а люди-то пишут о фильтрах в imagick, даже резкость можно повышать(!), оказывается. Попробовал - и действительно. В итоге - решил потратить некоторое время, написал программный вод. Там всё - в ОДНОМ файле, даже небольшая пиктограмма. В итоге, получилось вполне даже. Теперь - просто копируешь изображение или даже графический файл целиком (из Проводника Windows, например), вставляешь, устанавливаешь некоторые параметры и все, можно масштабировать. Для сравнения, вот как масштабируется приведенный выше рисунок:
Если сравнить, видно, что уменьшенное изображение стало как-то даже ЧЁТЧЕ, чем исходное. Например, желтый круг стал выглядеть чётче (как мне кажется). И, разумеется, никакой GIMP тут и рядом не стоял. Полученное маленькое изображение вполне годится, чтобы сделать из него значок/иконку. Что я и сделал.
Как оно работает (описание программы)
Вот как оно выглядит перед началом работы:

Там - наиболее типичные, по моему опыту, параметры. По умолчанию. От этих параметров существенно зависит качество изображения. Кроме них, используются еще разные фильтры (они здесь не показаны). Вот как выглядит типичный процесс подбора оптимального изображения после нескольких масштабирований:

Каждое из изображений слегка отличается (многие - незаметно для глаза), т.к. к нему был применен уникальный набор фильтров. Также, для ориентации, после изображений выводятся заданные параметры. За каждый запуск процедуры масштабирования получается 19 (хоть немного, но разных) изображений.
Остается только выбрать одно из них. Глаза разбегаются, конечно. Но, на самом деле, выбор происходит в процессе. Меняешь какой-нибудь параметр и смотришь, хуже стало или лучше. И, уже исходя из этого, меняешь параметры дальше.
Как видно, программа стоила того, чтобы ее сделать. А вообще, если так дело и дальше пойдет, как бы мне не пришлось делать собственный графический редактор. Правда, это работы СТОЛЬКО, что... Но, ежели всякие *** (ммм... как бы сказать помягче... крупные разработчики) меня вынудят, ну, тогда будем делать. А то мне уже недавно посоветовали сделать для себя собственный браузер. Зная мою привередливость в этом вопросе. И мое крайнее нежелание (от слова совсем) прогибаться под "новые технологии". Зная мое крайнее нежелание потакать многим так называемым новшествам (в ущерб удобству и свободе). Движок браузера, конечно, придется использовать готовый. А вот дальше....
И, да, в отличие от всяких "современностей", моя программа - кроссбраузерная, работает и в Firefox 24, и в РНР 5.3.
Как программа работает
Я ее, наверное, выложу на Гитхабе у себя. Как работает.
В область для вставки рисунка может быть, в общем случае, вставлено одно из следующих:
- Рисунок в виде dataURL, т.е. не в бинарном, а в текстовом виде, что-то типа
data:image/png;base64,iVBOR...и т.д. Это когда рисунок был скопирован из графического редактора, через PrintScreen, или если был скопирован графический файл целиком (из Проводника, например). - Рисунок может быть вставлен в виде ссылки (URL) со своего домена и по тому же самому протоколу.
- Рисунок может быть вставлен в виде ссылки (URL) с другого домена и/или по другому протоколу.
- Также может быть вставлено текстовое содержимое или иной html, помимо <img.../>.
Все эти четыре ситуации я обработал отдельно. Третья - самая сложная. Т.к. домен - другой (например, при копировании рисунка откуда-то с интернета, в браузере), то пришлось вначале посылать соответствующий URL рисунка серверу, тот скачивает его с целевого сайта при помощи функции file_get_contents(). Затем - преобразует его в соответствии с заданными параметрами и фильтрами и после этого высылает браузеру теги <img.../>, где в качестве src будут ссылки на уже сохраненные сервером рисунки. Браузер, получив эти ссылки, делает GET-запросы на сервер и скачивает соответствующие рисунки, затем отображает их на экране.
Ну, также сделал возможность запуска Проводника Windows по нажатию кнопки. Чтобы открыть каталог, где эти рисунки могут находиться (при условии, если не поставлена галочка для их удаления). Хотя, если требуется вставить полученный масштабированный рисунок в графический редактор, вполне можно скопировать его и из браузера.
Интересно, что для вставки в Microsoft Word НЕОБХОДИМО наличие соответствующего рисунка на сервере. Т.е. Word, похоже, берет рисунок не у браузера (как это делает графический редактор), а САМОСТОЯТЕЛЬНО скачивает его с сервера. Я это проверял. Если скопировать рисунок, а потом остановить работу сервера, то в Word в итоге копируется пустой прямоугольник вместо рисунка.
Единственное некоторое неудобство: для изменения размеров рисунка с учетом тех или иных фильтров, следует нажимать кнопку "Масштабировать". А не в режиме реального времени. Можно, конечно, сделать и масштабирование в реальном времени, но это будет притормаживать. Хотя... тот же GIMP тоже не слишком-то быстро выполняет это.
Сама программа находится здесь.
С уважением, Салимоненко Д.А.