Текущий архив: 2006.05.07;
Скачать: CL | DM;
ВнизДекодер PNG размером 6-8 килобайт Найти похожие ветки
← →
UFO (2005-08-21 05:33) [0]Я понимаю, что возможно не по адрессу но думаю что многим будет интересно
Я недавно взялся за написание декодера PNG минимального размера.
Минимальный размер на который жиреет ехешник - 8 кб (сжатие UPX,
без проверки ошибок внутри декодера). Хотел бы узнать,
это вообще кому-нибудь интересно - компактные декодеры графических
форматов. Я пока еще не закончил, но если кто хочет посмjтреть ...
http://www.homm86.narod.ru/tinydemo.zip
Первые восемь {$DEFINE ...} в модуле tinyPNG лучше не торгать,
а с остальными можно поигратся (там все описано)
И сразу хотел бы задать вопрос мастерам. Возможно ми будет прилинковать
*.obj файлы, откомпиленные в Visual C++ 7, и если можно то какаие будут
подводные камни кроме ссылок на функции из CRT.
← →
Vladimir Kladov (2005-08-21 21:36) [1]нельзя, формат у тех obj другой (coff), с ними Delphi не дружит. Если только что-то изменилось, и новый Delphi понимает coff или новый VC++ может не в coff (сомневаюсь).
← →
Thaddy (2005-08-22 03:48) [2]Recomple with BC++ to obtain OMF format that links to Delphi?
← →
BMouradov (2005-08-22 10:38) [3]Привет! Конечно, этот проект интересен! Жаль, не все png открываются (выдаёт #23), а то бы перешёл на него.
← →
UFO (2005-08-22 18:29) [4]Я же говорю, что только начал, и #23 заначит что открывается картинка с палитрой, а они не поддерживались. Сейчас палитру уже дописал, но какой-то глюк проскакивает. Как выловлю - обновлю.
← →
UFO (2005-08-22 21:09) [5]В общем еще много шероховатостей, но я рад представить вариант
с поддержкой палитры.
Вот полный список поддерживаемых форматов PNG:
- RGB с глубиной канала 8 и 16 бит.
- RGBA (алфа канал игнорируется) с глубиной канала 8 и 16 бит.
- Палитры 8, 4 бит.
И список форматов, которые ПОКА НЕ поддерживаются:
- Палитра 2, 1 бита.
- Оттенки серго 16, 8, 4, 2, 1 бит на канал в том числе и альфа каналом.
- Чересстрочные изображения (Interlace)
Впрочем сказать о поддержке или не поддержки форматов с 16 битами на канал
я не могу - у меня нет изображений такого формата. Photoshop 7 отказываеится
сохранять в PNG такие изображения. Тоже касается и 2 и 1 бит на канал
(имеются в виду не черно-белые однобитные изображения).
Ткаже хочу возвавть к великим мозгам по асамблеру: Filter_PAETH работает
ужасно медленно, т.к. вызывает внешнюю функцию PaethPredictor, а мой
вариант без использования стека работал еще медленее.
Ссылка осталась прежней:
http://www.homm86.narod.ru/tinydemo.zip
Плюс готовый проект, использующий tinyPNG и tinyJPGGIFBMP:
http://www.homm86.narod.ru/ets_src.zip
← →
Дмитрий Пырин (2005-08-23 09:26) [6]Бог в помощь..
Кстати, если уж пишете PNG декодер, посмотрите вот это, думаю будет полезно.
http://dmitry.e2e.ru/soft/pnglib.exe
это библиотека с исходниками на ассемблере и С
← →
puky (2005-08-23 09:27) [7]1) tinyJPGGIFBMP.pas - будет на всех виндах работать? win98, win2000, winXP, win2003
2) Это только просмотр jpeg?
← →
UFO (2005-08-23 20:00) [8]2 puky
1) Я думаю что на всех, т.к. в основе лежит OLE, а он входитв комплект 95 OSR2 (ИМХО).
2) Да только "декодирование".
← →
homm (2005-08-24 19:39) [9]Очередное обновление. Если не найду ошибок, то последнее.
Теперь поддерживаются все форматы кроме Interlace. Я решил его не доделовать,
т. к. это сильно раздует размер, я это противоречит первоначальной цели.
Достаточно полную справку и всегда (надеюсь) рабочие ссылки можно найти
на моей скромной странице.
http://www.homm86.harod.ru/
Если кто найдет глюк - пишите лучше мылом.
А к thaddy или Владимиру Кладову у меня просьба разместить библиотечку на своих сайтах
и кинуть ко мне ссылочку как к автору. Надеюсь что не слишком многого прошу.
← →
Vladimir Kladov (2005-08-24 20:43) [10]саму библиотеку или ссылки? пока оно в стадии активной разработки, ссылки-то легче.
← →
BMouradov (2005-08-25 10:46) [11]"Этот домен продается". Может, Вы переехали?
← →
thaddy (2005-08-25 13:21) [12]I will do that. Send a fresh version by email and I will include it.
← →
shalex (2005-08-25 13:26) [13]Правильный адрес http://www.homm86.narod.ru/ вместо http://www.homm86.harod.ru/
← →
homm (2005-08-25 21:49) [14]Не смотря на то, сто я писал в предыдущем сообщении, я все - таки
дописал режим Interlaced, кроме того, пофиксил три серьезных бага,
и все обошлось малой кровью (в плане размера исполняемого файла),
если включать поддержку Interlaced файлов то размер увеличивается
на 1 кб (0,5 кб для упакованных), если не включать - остается
прежним.
Итого: Минимальный размер декодера: 6,5 кб, Размер комплектации
"Все включено": 9 кб, что почти соответствует сабж.
Стадия "активной разработки", я думаю, закончена, поддерживаются
все подформаты формата PNG, и всю информацию, как верно заметил
shalex, можно найти здесь:
http://www.homm86.narod.ru/
Спасибо thaddy и Владимиру Кладову за ответ.
← →
shalex (2005-08-25 22:24) [15]А возможно с помощью tinyJPGGIFBMP.pas загрузить картинку из ресурса?
← →
homm (2005-08-26 20:26) [16]Все 443, найденые на моем винте, коректно декодированые PNG картинки
как оказалось не показатель... 10 из 15 картинок из набора для тестирования
PNG декодеров с сайта http://www.schaik.com/pngsuite/ - вот показатель.
Так что я опять был не прав... Очередное обновление! Зато после успешного
прохождения такого специального теста можно утверждать, что декодер 100%
рабочий. Впрочем, завалился я на довольно спецефических картинках
(как вам: оттенки серого 16 бит с альфа каналом размером 1x1), которых в
природе практически не встречается, так что если лень 100 кб каждый день
качать, то этот апдейт можно пропустить, (443 из 443 все-же о многом говорит).
2 shalex
Конечно можно! Только для этого нужно скачать свежую версию! Я сделал
две процедуры: tinyJPGGIFBMPFile и tinyJPGGIFBMPMemory. Пример как открыть
туды ресурс в демо-проекте tinyJPG.
Кстати кто - нибудь может пояснить почему нельзя вызывать так : (по тексту tinyJPG)tinyLoadJPGGIFBMPMemory(BitMap, DWORD(G), Sz);
а приходится делать так:DWORD(Ptr) := GlobalAlloc(GMEM_FIXED, Sz);
move(g^, Ptr^, Sz);
tinyLoadJPGGIFBMPMemory(BitMap, DWORD(Ptr), Sz);
При первом варианте IStream успешко создается, а вот JPEG из него не читается. ???
ЗЫ
Который день уже бьюсь над PNG, а вам, народ, JPEG подавай... обидно даже как-то... :)
← →
shalex (2005-08-26 23:23) [17]2homm: Спасибочки за доработку JPGа!
И не нужно обижаться, просто из-за одной картинки в 1 килобайт с логотипом компании не хочется добавлять 10 кило за PNG декодер ...
← →
GMax (2005-08-30 12:03) [18]а не работает, потому что (MSDN)
----------
Remarks
The return type of LoadResource is HGLOBAL for backward compatibility, not because the function returns a handle to a global memory block. Do not pass this handle to the GlobalLock or GlobalFree function. To obtain a pointer to the resource data, call the LockResource function.
----------
то есть это не настоящий global.
p.s.
а при копировании глобалов полезно L:=LockResource(G) делать :)
только опять же это только на настоящих глобалах работает
← →
PavelPro (2005-09-02 13:53) [19]homm
Извини может ты великий Делфер,а не дизайнер,но дизайн твоего сайта мягко сказать некрасив!
← →
homm (2005-09-02 18:45) [20]2 PavelPro
Да блин, его я сделал за пару минут в блокноте, если будет время я обязательно займусь и сайтом.
← →
homm (2005-09-02 19:12) [21]2 GMax
>To obtain a pointer to the resource data, call the LockResource function.
Ptr := LockResource(DWORD(G));
Ptr становится равет G, а tinyLoadJPGGIFBMPMemory(BitMap, DWORD(Ptr), Sz); по прежнему вылетает там же. Так что же делать то?
← →
GMax (2005-09-02 23:39) [22]становится равен G, потому что G не настоящий глобал.
я у себя в аналогичной функции(картинка из ресурса) сделал так. не знаю, насколько оптимально, но работает :)
[...]
Size:=SizeOfResource(Inst,R);
G:=LoadResource(Inst,R);
if G=0 then begin Result:=GetLastError; Exit; end;
CreateStreamOnHGlobal(0,True,Stream); // create empty stream;
if Stream=nil then begin Result:=GetLastError; Exit; end;
L:=LockResource(G);
Stream.Write(L,Size,@Writ);
if Size<>Writ then begin Result:=GetLastError; Exit; end;
Stream.Seek(0,0,i64); // seek to beginning
OleLoadPicture(Stream, Size, false, IID_IPicture, Pic);
[...]
← →
homm (2005-09-03 00:00) [23]2 GMax
Да это тоже самое:
1)move(g^, Ptr^, Sz);
2)Stream.Write(L,Size,@Writ);
Просто теперь я кажется понял
CreateStreamOnHGlobal(Ptr,True,Stream);
создает поток, но пустой!! т.к. глобал не настоящий, а какой спрос с пустого потока? , вот OleLoadPicture и вылетает, верно? Так бы и сказал, что CreateStreamOnHGlobal на самом деле вываливается, но по-своему.
А LockResource там и в помине не нужна потому что ее листиг:mov eax, [esp+4]
ret
← →
GMax (2005-09-03 22:13) [24]по идее lockresource здумана для MOVABLE глобала, чтобы менеджер памяти никуда его не унес :)
а что у тебя падало и где, я не проверял. но скорее всего поток создаётся не пустой, но указывающий на чужую область памяти
Страницы: 1 вся ветка
Текущий архив: 2006.05.07;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.009 c