Требуется обработать группу png-файлов.
В частности, прозрачный фон превратить в белый.
Количество файлов заранее неизвестно.
Попробовал pngcrush, но опция -bkgd как-то не даёт результатов. Или я её не умею готовить.
Какие ещё есть инструменты?
Можно, конечно, использовать GIMP, но хотелось бы менее громоздкое решение для пакетной обработки.
Imagemagick не годится, так как создаёт png-файл, не соответствующий стандарту.
Это критично, потому что файл должен читаться на устройстве, отличном от компьютера.
Прошу помощи.
[Решено:]Пакетная обработка png-файлов (Imagemagick не подходит)
Модератор: Модераторы разделов
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
-
- Сообщения: 127
- Статус: толстый полярный лис
- ОС: Gentoo-hardened
Re: [Решено:]Пакетная обработка png-файлов
Phatch
Код: Выделить всё
--- /dev/brain
+++ /dev/ass
Спасибо сказали:
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: [Решено:]Пакетная обработка png-файлов
1. Выхлоп ImageMagick (кстати, в чём несоответствие?) скормить optipng или чем-то перекодировать — не поможет?
2. Маленькую программку на Qt, например, написать.
2. Маленькую программку на Qt, например, написать.
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: [Решено:]Пакетная обработка png-файлов
daedalus , спасибо за phatch.
Интересный инструмент. В принципе помог. Возьму на заметку.
Есть книги в формате fb2 с иллюстрациями. Есть электронная читалка.
Иллюстрации в книгах по большей части в png и с прозрачным фоном.
Читалка этот прозрачный фон показывает чёрным. Почему? - вопрос отдельный.
Встаёт задача что-то с этим сделать.
Можно иллюстрации переделать в jpeg - в прошлый раз я так и сделал, но тогда довольно сильно пострадало качество. Поэтому в очередной раз решил всё-таки картинки оставить в png. Взял ImageMagick и... в книге ни одна картинка не отображается - сплошные черные квадраты. Не картинки с черным фоном, а именно пустые черные квадраты. И тогда я решил скормить читалке просто файл png сам по себе без интеграции в fb2.
И этот файл не открылся. Совсем. Причём, тот же файл сохраненный в GIMP открылся без проблем.
Полез анализировать различия этих файлов png и нашёл.
Оказалось, что ImageMagick добавляет chunk (как его по-русски? чанк? кусок?) VpAg.
В спецификации PNG vpAg мной не обнаружено.
Отсюда я делаю вывод, что это "фирменная фича" ImageMagick и на сайте тоже где-то об этом упоминается.
Следовательно, такой файл можно считать не соответствующим спецификации.
Ради интереса попробуйте сгенерировать хотя бы "розу", отдать её на растерзание pngcheck и вы увидите этот самый vpAg. Кстати он там ещё и unknown. То бишь, pngcheck его не знает.
Я не уверен на 100%, что именно из-за vpAg читалка не открывает файлы.
Но если такой файл открыть в GIMP, ничего с ним не делая, сохранить и закрыть, то в нём vpAg уже не будет и он прекрасно откроется в читалке. То есть присутствие vpAg - единственное серьёзное различие между годными и негодными файлами. И GIMP - единственный известный мне способ убрать эту штуку из файла.
На форуме ImageMagick поднимали подобную тему, там были разговоры, что в более новой версии IM добавлена возможность удалять vpAg наравне с другими.
Вот такая история.
Как ни стыдно в этом признаваться, но я очень плохой специалист. Да, я знаю несколько языков программирования, но я никогда не писал для Linux (вообще-то писал один раз, но на FreePascal), язык СИ я почти не знаю, а тут ещё с Qt придётся разбираться, Бог знает, сколько времени... Да и сам формат PNG надо будет разжёвывать. В любом случае это будет очередной велосипед. Инструментов и так полно, вряд ли я напишу что-то лучше. Тогда уж проще для того же GIMP скрипт написать.
Я, конечно, ещё поковыряю pngcrush, попробую консольную версию GIMP, какой вариант больше понравится, на том остановлюсь, но на данный момент phatch в консольном варианте успешно решает мою задачу.
Всем спасибо.
Интересный инструмент. В принципе помог. Возьму на заметку.
Ну, история такая.
Есть книги в формате fb2 с иллюстрациями. Есть электронная читалка.
Иллюстрации в книгах по большей части в png и с прозрачным фоном.
Читалка этот прозрачный фон показывает чёрным. Почему? - вопрос отдельный.
Встаёт задача что-то с этим сделать.
Можно иллюстрации переделать в jpeg - в прошлый раз я так и сделал, но тогда довольно сильно пострадало качество. Поэтому в очередной раз решил всё-таки картинки оставить в png. Взял ImageMagick и... в книге ни одна картинка не отображается - сплошные черные квадраты. Не картинки с черным фоном, а именно пустые черные квадраты. И тогда я решил скормить читалке просто файл png сам по себе без интеграции в fb2.
И этот файл не открылся. Совсем. Причём, тот же файл сохраненный в GIMP открылся без проблем.
Полез анализировать различия этих файлов png и нашёл.
Оказалось, что ImageMagick добавляет chunk (как его по-русски? чанк? кусок?) VpAg.
Судя по всему, vpAg добавляется абсолютно во все png-файлы, получаемые на выходе ImageMagick. И при генерации новых, и при конвертации существующих.The default behavior is to include all known PNG ancillary chunks plus ImageMagick's private vpAg ("virtual page") chunk, and to exclude all PNG chunks that are unknown to ImageMagick, regardless of their PNG "copy-safe" status as described in the PNG specification.
В спецификации PNG vpAg мной не обнаружено.
Отсюда я делаю вывод, что это "фирменная фича" ImageMagick и на сайте тоже где-то об этом упоминается.
Следовательно, такой файл можно считать не соответствующим спецификации.
Не помогает. vpAg помечен как "private" да ещё "safe-to-copy" и выбить его оттуда мне не удалось ни штатными средствами IM, ни pngcrush. Насчет optipng не знаю, не пробовал, но навскидку там подходящих опций не увидел.писал(а): ↑06.10.2012 14:44Выхлоп ImageMagick скормить optipng или чем-то перекодировать — не поможет?
Ради интереса попробуйте сгенерировать хотя бы "розу", отдать её на растерзание pngcheck
Код: Выделить всё
convert rose: png:- | pngcheck -v
Я не уверен на 100%, что именно из-за vpAg читалка не открывает файлы.
Но если такой файл открыть в GIMP, ничего с ним не делая, сохранить и закрыть, то в нём vpAg уже не будет и он прекрасно откроется в читалке. То есть присутствие vpAg - единственное серьёзное различие между годными и негодными файлами. И GIMP - единственный известный мне способ убрать эту штуку из файла.
На форуме ImageMagick поднимали подобную тему, там были разговоры, что в более новой версии IM добавлена возможность удалять vpAg наравне с другими.
Вот такая история.
УВЫ! Несмотря на профильное в/о, эта задача мне не по силам.
Как ни стыдно в этом признаваться, но я очень плохой специалист. Да, я знаю несколько языков программирования, но я никогда не писал для Linux (вообще-то писал один раз, но на FreePascal), язык СИ я почти не знаю, а тут ещё с Qt придётся разбираться, Бог знает, сколько времени... Да и сам формат PNG надо будет разжёвывать. В любом случае это будет очередной велосипед. Инструментов и так полно, вряд ли я напишу что-то лучше. Тогда уж проще для того же GIMP скрипт написать.
Я, конечно, ещё поковыряю pngcrush, попробую консольную версию GIMP, какой вариант больше понравится, на том остановлюсь, но на данный момент phatch в консольном варианте успешно решает мою задачу.
Всем спасибо.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: [Решено:]Пакетная обработка png-файлов
fflatx писал(а): ↑07.10.2012 00:54Оказалось, что ImageMagick добавляет chunk (как его по-русски? чанк? кусок?) VpAg.
…
Отсюда я делаю вывод, что это "фирменная фича" ImageMagick и на сайте тоже где-то об этом упоминается.
Следовательно, такой файл можно считать не соответствующим спецификации.
…
Я не уверен на 100%, что именно из-за vpAg читалка не открывает файлы.
На самом деле PNG позволяет добавлять чанки (привычнее их так называть, хоть и калька) с абсолютно любым содержанием. Если первая буква маленькая, то это не важный для понимания чанк и декодер должен его игнорировать, если не понимает. Т.е. скорее ошибка допущена в читалке, но впрочем её не изменить.
Угу, велосипед. Но разбирать PNG там не надо будет. Примерно так:
Код: Выделить всё
#include <QApplication>
#include <QDebug>
#include <QStringList>
#include <QImage>
#include <QPainter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QStringList args = a.arguments();
if (argc < 6) {
qWarning() << "Usage:" << args.at(0).toLocal8Bit().data() << "in-file-name bg-color-red bg-color-green bg-color-blue out-file-name";
return 1;
}
QImage in(args.at(1));
if (in.isNull()) {
qWarning() << "File" << args.at(1) << "couldn't be read by QImage, sorry";
return 1;
}
QImage out(in.size(), QImage::Format_RGB888);
out.fill(QColor(args.at(2).toUInt(), args.at(3).toUInt(), args.at(4).toUInt()));
{
QPainter p(&out);
p.drawImage(0, 0, in);
}
out.save(args.at(5), "PNG");
return 0;
}
-
- Сообщения: 3728
- Статус: Многоуважаемый джинн...
- ОС: Slackware64-14.1/14.2
Re: [Решено:]Пакетная обработка png-файлов
Странное дело.
Сегодня попробовали
так он преспокойно этот чанк удалил.
Вчера не хотел ни в какую.Чертовщина какая-то.
Ну раз такое дело, возвращаюсь к использованию ImageMagick.
Тема потеряла актуальность.
Сегодня попробовал
Код: Выделить всё
convert rose: rose.png
Код: Выделить всё
pngcrush -rem vpAg rose.png rose2.png
Вчера не хотел ни в какую.Чертовщина какая-то.
Ну раз такое дело, возвращаюсь к использованию ImageMagick.
Тема потеряла актуальность.