Утилита нарезки больших карт для просмотра на читалке

(Перепост с http://www.the-ebook.org/forum/)

v.0.3 лежит здесь: http://rghost.ru/3425296
Исправлено две ошибки; добавлена поддержка палитр электрокнижки, что позволяет добиться более высокого качества изображения; добавлена утилита FB2mFB2.exe для нарезки карт непосредственно в FB2-файле;

v.0.2 лежит здесь: http://rghost.ru/3335161
Исправлена одна ошибка, пара недочётов, изменена логика выбора числа цветов в выходной картинке.

v.0.1 лежит здесь: http://rghost.ru/3304960

В принципе, программа может быть применена не только для читалок, но и для любых устройств с малым размером экрана и поддержкой FB2 или PDF. Программа писалась для себя, поэтому любые неорганизованные выкрики с мест, типа "Хочу ГУЙ!" или там "А почему она не читает мой любимый, давно запорченный файл, который мне завещал ещё мой дедушка?", будут цынически проигнорированы.

Особенности программы FB2mFB2.exe:
а) программа тестировалась только на простых и корректных FB2-файлах;
б) обработке подвергаются только изображения, находящиеся внутри какой-либо {section} и вне абзацев, таблиц и т.д. (т.е. не inline images);
в) если изображение имело атрибут title, то содержание атрибута записывается петитом под преобразованным изображением;

Поведение выходного FB2-файла сильно зависит и от железа и от программы чтения FB2 файлов, поэтому небольшой списочек:
1. Конверторы.
fb2lrf и fb2pdf - не поддерживают inline images, а посему пролетают.
FB2DocBook - все работает, только расстояния между изображениями какие-то неестественно большие.
2. Компьютерные читалки.
AlReader - всё работает.
FBReader - на верхнем уровне все работает, на остальных уровнях, по-видимому ошалев от открывшегося богатства возможностей формата FB2, программа ни на что не реагирует. Лечится с помощью ключика FBReaderPatch, но это не есть хорошо, т.к. при этом все потроха оказываются видимыми в основном теле книги.
CoolReader3 - внутрь изображения заходит, а вот вернуться обратно на верхний уровень не может и выбрасывает в начало книги, что очень неудобно.
3. Электрокнижки.
PRS-505 - с помощью FB2DocBook всё работает.
PB301+, прошивка v.14.2 - это нечто. Отрисовывает кнопки слева-направо, начиная с левого края экрана, а hotspots под эти кнопки располагает справа-налево, начиная с правого края экрана. Подпись под картинкой тоже умудрилась перевернуть. В ПБ работают арабы? Смените их на индийских кодеров - больше толку будет.
Лечится опять же ключиком FBReaderPatch, но всё равно изредка возникает мусор на экране.

Если кто проверит на каком-то нестандартном оборудовании - отпишитесь.

В .INI файле записаны установки, оптимальные для связки PRS-505 + FB2DocBook.

Оптимальные установки для Азбуки-516 от 1_абрам: PageWidth = 576, PageHeight = 750, DeviceXDPI = 166.0, DeviceYDPI = 166.0, FBReaderPatch = FALSE, VertImageMargin = 25, HorizImageMargin = 25

Комментарии

Ага. А можно в тест-сьюте выложить ещё и нарезанные .fb2'шки?

Что, тоже не работает? Да что ж такое-то...
На трех компьютерах и двух операционках проверил - у меня никаких отклонений.
Попробуйте скопировать файл из TestSuite в директорию с программой и там запустить.

Да не, я просто поленился скачивать и запускать. :-)
PS. Скачал, запустил. Генерируется невалидный файл. Ща разберусь и поделюсь.
PPS. Кстати, в процессе анализа обнаружил глюк в своей программе. Разбираюсь.
PPPS. Ага, есть: в сгенерированном .fb2 напрочь отсутствует document-info!

Да, это ошибка, поправлю.

Дмитрий Шкарин написал:
Что, тоже не работает? Да что ж такое-то...
На трех компьютерах и двух операционках проверил - у меня никаких отклонений.
А что, у многих не работала? Возможно, у кого-то в системном каталоге уже стоит библиотека freeimage.dll другой версии. Попробуйте слинковать со статической .lib'ой: размер программы, понятно, увеличится, но всяко на меньше, чем весит полная .dll'а, зато отпадёт зависимость от уже имеющихся .dll'ов.

То-то и обидно, что размер экзешника будет практически равен размеру DLL-ки.

Дмитрий Шкарин написал:
размер экзешника будет практически равен размеру DLL-ки.
Я в аналогичных обстоятельствах брал либу попроще - libpng...

Я её взял наугад. Оказалось - не очень. Но и попроще не подойдет, там куча разных масштабирований, вырезаний, изменения глубины цвета и т.д.

Дмитрий Шкарин написал:
там куча разных масштабирований, вырезаний
Ага, уловил. Но даже если так - линковать в статике, по крайней мере, безопаснее, чем зависеть от кем-то установленной .dll'ы. А .exe'шник можно и ужать UPX'ом или ещё чем...

Дмитрий Шкарин написал:
Поведение программы сильно зависит и от железа и от программы чтения FB2 файлов
Не понял. Генерация .fb2 происходит задолго до того, как на сгенерированный файл будет натравлена читалка, => зависеть никак не может. Видимо, "сгенерированный программой .fb2-файл несовместим с некоторыми читалками" - щас тоже проанализирую...
Кстати, навскидку - пожелание, оно же просьба: сделать вывод подсказки по опциям (по ключику "-h", "-?" или "/?" - подробный, по пустой командной строке - просто намекнуть, какой ключик задать для подсказки). Пока по "/?" программа пытается что-то читать, и ей это явно удаётся! - но дальше она таки обламывается и падает с воплем "Too small image". :-(
Дмитрий Шкарин написал:
ключиком FBReaderPatch
Куда и в каком виде его задавать? Попробовал варианты "Map2FB2.EXE -FBReaderPatch begin.png", "Map2FB2.EXE --FBReaderPatch begin.png", "Map2FB2.EXE /FBReaderPatch begin.png" - ни в поведении программы, ни в сгенерированном файле никакой разницы. :(
PS. Нашёл: оказывается, это в Map2FB2.ini. ИМХО неудобно - я бы сделал задание почти всех параметров с командной строки с сохранением последнего заданного значения в .ini (и, ясен перец, брать оттуда, если в командной строке не задано) плюс показ настроек при генерации.

Рыжий Тигра написал:

PS. Нашёл: оказывается, это в Map2FB2.ini. ИМХО неудобно - я бы сделал задание почти всех параметров с командной строки с сохранением последнего заданного значения в .ini (и, ясен перец, брать оттуда, если в командной строке не задано) плюс показ настроек при генерации.

Зачем? Один раз настроили и забыли про него.

Дмитрий Шкарин написал:
Рыжий Тигра написал:
я бы сделал задание почти всех параметров с командной строки с сохранением последнего заданного значения в .ini

Зачем? Один раз настроили и забыли про него.
Даже если - всё равно неудобно, если итераций больше одной. А если надо переподстраивать под разные смотрелки?

Так ведь редактировать всегда удобнее в редакторе, чем в командной строке.

Дмитрий Шкарин написал:
редактировать всегда удобнее в редакторе, чем в командной строке.
Ради бога, ключами можно и не пользоваться, а всегда править в .ini. Но при множественных, тем более разовых, экспериментах ключи проще. (Читать-писать в .ini хорошо через GetPrivateProfileXXX() / WritePrivateProfileXXX(), плюс отдельный ключ в строке - "не сохранять новую комбинацию ключей в .ini", плюс задание имени .ini-файла опять же ключом - типа несколько конфигурваций под разные читалки... Я б сделал так.)
(Кстати, выкладывать в open source не собираетесь?)

Рыжий Тигра написал:
Ради бога, ключами можно и не пользоваться, а всегда править в .ini. Но при множественных, тем более разовых, экспериментах ключи проще.

Это Вы просто .INI готовить не умеете: в FAR Editor "правим - F2 - Ctrl-Tab - Ctrl-E - Enter - смотрим результат - Ctrl-Tab - опять правим".

Рыжий Тигра написал:
(Кстати, выкладывать в open source не собираетесь?)

Да нет там ничего секретного, но лень исходники в пристойный вид приводить.

Дмитрий Шкарин написал:
.INI готовить не умеете: в FAR Editor "правим - F2 - Ctrl-Tab - Ctrl-E - Enter - смотрим результат - Ctrl-Tab - опять правим".
Ага, а теперь повторить это пару десятков раз. Да из батничка. Да с разными параметрами. :-) (Не, ну я знаю: заготовить несколько десятков .ini-файлов и копировать в нужном порядке... быстро, но неэстетично. :-)
Дмитрий Шкарин написал:
лень исходники в пристойный вид приводить.
Дык мне тоже лень. Но ж лежат же! :-)

Нуу, значит Вы гораздо менее ленивы, чем я ;-).

Может, вам просто страшно? :-) Я тоже перед выкладкой первой утильки кошмарно боялся, с полгода прямо трясся... так и не выложил. :-( А потом за пару лет набрался наглости - и следующую таки выложил. И ничего - качают, юзают, даже отзываются об исходнике... Приятно. :-)

Ну ленивый я, ленивый! Не подбивайте меня на избыточные действия. А так-то: мой алгоритм стоит во всех современных архиваторах, все ругаются на корявость исходника, а я только похохатываю. Так что в пофигизме меня обвинить можно, а вот в боязни - нет.
Ситуация такая: Map2FB2 использует пяток совершенно плёвых функций из моей библиотеки, которая содержит служебные данные и распространять я её не могу. Согласитесь, сидеть и выковыривать функции из библиотеки, отслеживать их зависимости или писать им замену - какое занятие может быть нуднее?

X