Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Декодер PNG размером 6-8 килобайт


Страницы:   1 2

UFO ©   (2005-08-21 05:33:00) 

Я понимаю, что возможно не по адрессу но думаю что многим будет интересно

Я недавно взялся за написание декодера PNG минимального размера.
Минимальный размер на который жиреет ехешник -  8 кб (сжатие UPX,
без проверки ошибок внутри декодера). Хотел бы узнать,
это вообще кому-нибудь интересно - компактные декодеры графических
форматов. Я пока еще не закончил, но если кто хочет посмjтреть ...

http://www.homm86.narod.ru/tinydemo.zip

Первые восемь {$DEFINE ...} в модуле tinyPNG лучше не торгать,
а с остальными можно поигратся (там все описано)

И сразу хотел бы задать вопрос мастерам. Возможно ми будет прилинковать
*.obj файлы, откомпиленные в Visual C++ 7, и если можно то какаие будут
подводные камни кроме ссылок на функции из CRT.


GMax   (2005-09-03 22:13:00) [1]

по идее lockresource здумана для MOVABLE глобала, чтобы менеджер памяти никуда его не унес :)

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


homm   (2005-09-03 00:00:00) [2]

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-02 23:39:00) [3]

становится равен 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-02 19:12:00) [4]

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); по прежнему вылетает там же. Так что же делать то?


homm   (2005-09-02 18:45:00) [5]

2 PavelPro
Да блин, его я сделал за пару минут в блокноте, если будет время я обязательно займусь и сайтом.


PavelPro   (2005-09-02 13:53:00) [6]

homm
Извини может ты великий Делфер,а не дизайнер,но дизайн твоего сайта мягко сказать некрасив!


GMax   (2005-08-30 12:03:00) [7]

а не работает, потому что (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) делать :)
только опять же это только на настоящих глобалах работает


shalex   (2005-08-26 23:23:00) [8]

2homm: Спасибочки за доработку JPGа!
И не нужно обижаться, просто из-за одной картинки в 1 килобайт с логотипом компании не хочется добавлять 10 кило за PNG декодер ...


homm   (2005-08-26 20:26:00) [9]

Все 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-25 22:24:00) [10]

А возможно с помощью  tinyJPGGIFBMP.pas загрузить картинку из ресурса?


homm   (2005-08-25 21:49:00) [11]

Не смотря на то, сто я писал в предыдущем сообщении, я все - таки
дописал режим Interlaced, кроме того, пофиксил три серьезных бага,
и все обошлось малой кровью (в плане размера исполняемого файла),
если включать поддержку Interlaced файлов то размер увеличивается
на 1 кб (0,5 кб для упакованных), если не включать - остается
прежним.
Итого: Минимальный размер декодера: 6,5 кб, Размер комплектации
"Все включено": 9 кб, что почти соответствует сабж.
Стадия "активной разработки", я думаю, закончена, поддерживаются
все подформаты формата PNG, и всю информацию, как верно заметил
shalex, можно найти здесь:

http://www.homm86.narod.ru/

Спасибо thaddy и Владимиру Кладову за ответ.


shalex   (2005-08-25 13:26:00) [12]

Правильный адрес http://www.homm86.narod.ru/вместо http://www.homm86.harod.ru/


thaddy   (2005-08-25 13:21:00) [13]

I will do that. Send a fresh version by email and I will include it.


BMouradov   (2005-08-25 10:46:00) [14]

"Этот домен продается". Может, Вы переехали?


Vladimir Kladov   (2005-08-24 20:43:00) [15]

саму библиотеку или ссылки? пока оно в стадии активной разработки, ссылки-то легче.


homm   (2005-08-24 19:39:00) [16]

Очередное обновление. Если не найду ошибок, то последнее.
Теперь поддерживаются все форматы кроме Interlace. Я решил его не доделовать,
т. к. это сильно раздует размер, я это противоречит первоначальной цели.

Достаточно полную справку и всегда (надеюсь) рабочие ссылки можно найти
на моей скромной странице.

http://www.homm86.harod.ru/

Если кто найдет глюк - пишите лучше мылом.

А к thaddy или Владимиру Кладову у меня просьба разместить библиотечку на своих сайтах
и кинуть ко мне ссылочку как к автору. Надеюсь что не слишком многого прошу.


UFO   (2005-08-23 20:00:00) [17]

2 puky
1) Я думаю что на всех, т.к. в основе лежит OLE, а он входитв комплект 95 OSR2 (ИМХО).
2) Да только "декодирование".


puky   (2005-08-23 09:27:00) [18]

1) tinyJPGGIFBMP.pas - будет на всех виндах работать? win98, win2000, winXP, win2003
2) Это только просмотр jpeg?


Дмитрий Пырин   (2005-08-23 09:26:00) [19]

Бог в помощь..
Кстати, если уж пишете PNG декодер, посмотрите вот это, думаю будет полезно.
http://dmitry.e2e.ru/soft/pnglib.exe

это  библиотека с исходниками на ассемблере и С


UFO   (2005-08-22 21:09:00) [20]

В общем еще много шероховатостей, но я рад представить вариант
с поддержкой палитры.

Вот полный список поддерживаемых форматов 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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо