[Решено:]Пакетная обработка png-файлов (Imagemagick не подходит)

Работа с различными видами графики, изображений, решение проблем

Модератор: Модераторы разделов

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

[Решено:]Пакетная обработка png-файлов

Сообщение Hephaestus »

Требуется обработать группу png-файлов.
В частности, прозрачный фон превратить в белый.
Количество файлов заранее неизвестно.

Попробовал pngcrush, но опция -bkgd как-то не даёт результатов. Или я её не умею готовить.

Какие ещё есть инструменты?
Можно, конечно, использовать GIMP, но хотелось бы менее громоздкое решение для пакетной обработки.


Imagemagick не годится, так как создаёт png-файл, не соответствующий стандарту.
Это критично, потому что файл должен читаться на устройстве, отличном от компьютера.

Прошу помощи.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

Аватара пользователя
daedalus
Сообщения: 127
Статус: толстый полярный лис
ОС: Gentoo-hardened

Re: [Решено:]Пакетная обработка png-файлов

Сообщение daedalus »

Phatch

Код: Выделить всё

--- /dev/brain
+++ /dev/ass
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [Решено:]Пакетная обработка png-файлов

Сообщение NickLion »

1. Выхлоп ImageMagick (кстати, в чём несоответствие?) скормить optipng или чем-то перекодировать — не поможет?
2. Маленькую программку на Qt, например, написать.
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: [Решено:]Пакетная обработка png-файлов

Сообщение Hephaestus »

daedalus , спасибо за phatch.
Интересный инструмент. В принципе помог. Возьму на заметку.


NickLion писал(а):
06.10.2012 14:44
кстати, в чём несоответствие?
Ну, история такая.
Есть книги в формате fb2 с иллюстрациями. Есть электронная читалка.
Иллюстрации в книгах по большей части в png и с прозрачным фоном.
Читалка этот прозрачный фон показывает чёрным. Почему? - вопрос отдельный.
Встаёт задача что-то с этим сделать.
Можно иллюстрации переделать в jpeg - в прошлый раз я так и сделал, но тогда довольно сильно пострадало качество. Поэтому в очередной раз решил всё-таки картинки оставить в png. Взял ImageMagick и... в книге ни одна картинка не отображается - сплошные черные квадраты. Не картинки с черным фоном, а именно пустые черные квадраты. И тогда я решил скормить читалке просто файл png сам по себе без интеграции в fb2.
И этот файл не открылся. Совсем. Причём, тот же файл сохраненный в GIMP открылся без проблем.
Полез анализировать различия этих файлов png и нашёл.
Оказалось, что ImageMagick добавляет chunk (как его по-русски? чанк? кусок?) VpAg.
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.
Судя по всему, vpAg добавляется абсолютно во все png-файлы, получаемые на выходе ImageMagick. И при генерации новых, и при конвертации существующих.
В спецификации PNG vpAg мной не обнаружено.
Отсюда я делаю вывод, что это "фирменная фича" ImageMagick и на сайте тоже где-то об этом упоминается.
Следовательно, такой файл можно считать не соответствующим спецификации.

писал(а):
06.10.2012 14:44
Выхлоп ImageMagick скормить optipng или чем-то перекодировать — не поможет?
Не помогает. vpAg помечен как "private" да ещё "safe-to-copy" и выбить его оттуда мне не удалось ни штатными средствами IM, ни pngcrush. Насчет optipng не знаю, не пробовал, но навскидку там подходящих опций не увидел.
Ради интереса попробуйте сгенерировать хотя бы "розу", отдать её на растерзание pngcheck

Код: Выделить всё

convert rose: png:- | pngcheck -v
и вы увидите этот самый vpAg. Кстати он там ещё и unknown. То бишь, pngcheck его не знает.
Я не уверен на 100%, что именно из-за vpAg читалка не открывает файлы.
Но если такой файл открыть в GIMP, ничего с ним не делая, сохранить и закрыть, то в нём vpAg уже не будет и он прекрасно откроется в читалке. То есть присутствие vpAg - единственное серьёзное различие между годными и негодными файлами. И GIMP - единственный известный мне способ убрать эту штуку из файла.
На форуме ImageMagick поднимали подобную тему, там были разговоры, что в более новой версии IM добавлена возможность удалять vpAg наравне с другими.
Вот такая история.

NickLion писал(а):
06.10.2012 14:44
Маленькую программку на Qt, например, написать.
УВЫ! Несмотря на профильное в/о, эта задача мне не по силам.
Как ни стыдно в этом признаваться, но я очень плохой специалист. Да, я знаю несколько языков программирования, но я никогда не писал для Linux (вообще-то писал один раз, но на FreePascal), язык СИ я почти не знаю, а тут ещё с Qt придётся разбираться, Бог знает, сколько времени... Да и сам формат PNG надо будет разжёвывать. В любом случае это будет очередной велосипед. Инструментов и так полно, вряд ли я напишу что-то лучше. Тогда уж проще для того же GIMP скрипт написать.



Я, конечно, ещё поковыряю pngcrush, попробую консольную версию GIMP, какой вариант больше понравится, на том остановлюсь, но на данный момент phatch в консольном варианте успешно решает мою задачу.
Всем спасибо.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [Решено:]Пакетная обработка png-файлов

Сообщение NickLion »

fflatx писал(а):
07.10.2012 00:54
Оказалось, что ImageMagick добавляет chunk (как его по-русски? чанк? кусок?) VpAg.

Отсюда я делаю вывод, что это "фирменная фича" ImageMagick и на сайте тоже где-то об этом упоминается.
Следовательно, такой файл можно считать не соответствующим спецификации.

Я не уверен на 100%, что именно из-за vpAg читалка не открывает файлы.

На самом деле PNG позволяет добавлять чанки (привычнее их так называть, хоть и калька) с абсолютно любым содержанием. Если первая буква маленькая, то это не важный для понимания чанк и декодер должен его игнорировать, если не понимает. Т.е. скорее ошибка допущена в читалке, но впрочем её не изменить.

fflatx писал(а):
07.10.2012 00:54
язык СИ я почти не знаю, а тут ещё с Qt придётся разбираться, Бог знает, сколько времени... Да и сам формат 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;
}
Спасибо сказали:

Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2

Re: [Решено:]Пакетная обработка png-файлов

Сообщение Hephaestus »

Странное дело.
Сегодня попробовал

Код: Выделить всё

convert rose: rose.png
и

Код: Выделить всё

pngcrush -rem vpAg rose.png rose2.png
так он преспокойно этот чанк удалил.
Вчера не хотел ни в какую.Чертовщина какая-то.
Ну раз такое дело, возвращаюсь к использованию ImageMagick.
Тема потеряла актуальность.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали: