Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Вниз

Декодер 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 вся ветка

Форум: "KOL";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.011 c
2-1145420179
Rubey
2006-04-19 08:16
2006.05.07
Централизованная БД для сбора информации


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


15-1145125767
Yegorchic
2006-04-15 22:29
2006.05.07
Новый земельный и водоохранный закон


15-1145001382
eukar
2006-04-14 11:56
2006.05.07
небольшая задача по матстатистике


2-1145533315
jiurafgdfg
2006-04-20 15:41
2006.05.07
Обьясните!!!Что-то непонятное как считает Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский