Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.037 c
15-1145185280
Sirian
2006-04-16 15:01
2006.05.07
Программная Компиляция


15-1144933267
Zxcda
2006-04-13 17:01
2006.05.07
Почему в Access в поле Действительного типа, в значениях...


15-1145209968
Lex Luthor
2006-04-16 21:52
2006.05.07
Как прикрипить к мому приложению форму по типу винампа


1-1143653083
Kolan
2006-03-29 21:24
2006.05.07
Проектирование взаимодействия плагина с программой


15-1144937234
ArtemESC
2006-04-13 18:07
2006.05.07
Объясните тупому на примере ,пожалуйста, ...