![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как пользоваться KOLPNG
-=mixir=- © (2003-05-31 14:50:00)Хочу написать конвертор BMP>PNG,
юзаю KOLPNG не ничего не работает.
Вот код, подскажите где ошибка.
uses kolpng,kol;
{$R *.res}
var png:PPngObject;
bmp:PBitmap;
begin
{creating}
png:=NewPngObject;
bmp:=NewBitmap(50,50);
{initializing}
bmp.PixelFormat:=pf16bit;
bmp.Canvas.Rectangle(0,0,49,49);
bmp.Canvas.TextOut(10,10,'PNG Sample');
{Assign}
png.CompressionLevel:=9;
png.AssignHandle(bmp.Handle,false,0); // Не пашет!
if png.Error<> ErrOK then Showmessage('Error');
png.SaveToFile('NewBmp.png'); // 44 байта размер файла NewBmp.png
png.Free;
bmp.Free;
end.
Walkboy (2004-01-09 16:24:00) [1]Ошибки Undeclared identifier..., которые были до модификации KolZLib, полностью описал azsdсегодня вот в этой теме: bugs report: KOLPNG http://www.delphimaster.ru/cgi-bin/forum.pl?id=1073629236&n=10
Там же я более полно изложил свой вариант исправления (модификации) библиотеки KolZLib.
Walkboy (2004-01-09 15:27:00) [2]Хочу вернуться к теме KolPNG.
Я столкнулся с такой же проблемой, что и -=mixir=-полгода назад.
1. По поводу того, что не так в дистрибутивах:
Да, Владимир, у меня KolPNG в том виде, в котором она есть, компилироваться отказалась. Она использует набор inflate-/deflate-функций библиотеки KolZLib. В KolZLib мне пришлось повторить описание этих функций в секции Interface: (блоки функций, озаглавленные:
// deflate compresses data
// inflate decompresses data).
В эту же секцию из секции implementationя перенес const.
После этих манипуляций KolPNG откомпилировалась (ранее выдавала ошибки: Undeclared identifier).
2. Очень странно ведет себя процедура AssignHandle.
Вот текст программы, которая прекрасно отрабатывает:
program Sample;
{$APPTYPE CONSOLE}
uses KOL, KOLPng;
var Png:PPngObject;
Bmp:PBitmap;
begin
Png := NewPngObject;
Png.LoadFromFile('t:\asd.png');
Png.SaveToFile('t:\asd2.png');
Png.Free;
end.
В результате создается новый PNG-файл. Никаких нареканий на работу. PNG-файлы, сделанные Adobe ImageReady сжимает процентов на 10-25.
Проблемы начинаются, когда необходимо сжать BMP-файл. Вот тело программы:
Bmp := NewBitmap( 0, 0 );
Bmp.LoadFromFile('t:\asd.bmp');
Png := NewPngObject;
Png.AssignHandle( Bmp.Handle, FALSE, 0 );
Png.SaveToFile('t:\asd2.png');
Png.Free; Bmp.Free;
В результате выполнения этого кода создается PNG-файл размером 44 байта.
В процедуре AssignHandle, насколько я понимаю, некорректно отрабатывает BuildHeader. При трассировке именно эта процедура показывет странные результаты (например, свойства Header после присвоения им новых значений не изменяются). Проверял на PNG- и BMP-файлах разрешения 800х600, глубина цвета: 24 бита.
Использую:
OS: WinXP SP1 Pro Eng;
App: Delphi 5;
Unit: KOL 1.87; KolPNG v2.1.174; KolZLib v3.179;
3. Иполняемый Файл GrabScreen работает без проблем, а скомпилированый из исходников создает 44-х байтные файлы. Пытался читать про исходники PNG - там что-то говорится про использование MMX. У меня процессор АМД Аthlon XP. Может в этом причина?
Кладов (2003-06-02 21:57:00) [3]последние лежат на сайте. PNG я обновил вчера (или позавчера), ZLib от какого-то сентября, но у меня точно такой же, и никаких проблем с компиляцией.
-=mixir=- (2003-06-02 20:54:00) [4]Не могли бы вы послать мне на мыло (mixShadow@xaker.ru)
свежие KOLZLIB и KOLPNG желательно с примером ?
Заранее благодарен...
Кладов (2003-06-01 13:15:00) [5]
> некоторые inflate функции не достыпны в немодуля.
и что, примеры выше при этом не компилировались? я пытаюсь выяснить, что не так в дистрибутиве, и в каком. У меня компилируется без проблем. Может, вы давно скачали KOLPng/KOLZLib, и с тех пор вышло обновление?
-=mixir=- (2003-06-01 11:05:00) [6]формат у него 24 бита.
>осталось во втором примере сразу за bmp.LoadFromFile сделать >bmp.SaveToFile( 'loaded.bmp' ); и убедиться, что битмап не >грузится. Или имя не то, или путь надо точный указывать. Я >всегда пишу GetStartDir + имя, помогает
Не ну ето не серьезно, мне кажется все дело в KOLPNG,
то что я скачав качав KOLZLIB и KOLPNG при компиляции обнаржил,
что некоторые inflate функции не достыпны в немодуля.
Кладов (2003-05-31 19:44:00) [7]а кстати, какой формат у того мегабайтного битмапа, не 256 цветов случаем?
Что будет, если bmp.loadfromfile добавить bmp.PixelFormat := pf32bit; ?
Кажется, TPNGObject не хочет корректно сохранять картинки с палитрой, точнее сохраняет, но только сам потом и может прочитать - другие программы такой порядок чунков не приемлют. Сейчас я ему поправочку сделаю на этот счет.
Кладов (2003-05-31 17:31:00) [8]осталось во втором примере сразу за bmp.LoadFromFile сделать bmp.SaveToFile( 'loaded.bmp' ); и убедиться, что битмап не грузится. Или имя не то, или путь надо точный указывать. Я всегда пишу GetStartDir + имя, помогает.
-=mixir=- (2003-05-31 16:18:00) [9]Я уже пробовал и так:
uses kolpng,kol;
{$R *.res}
var png:PPngObject;
bmp:PBitmap;
begin
{creating}
png:=NewPngObject;
bmp:=NewBitmap(50,50);
bmp.loadfromfile('ScrinShot.bmp'); // 2,5 мега весить Bmp
png.CompressionLevel:=9;
png.AssignHandle(bmp.Handle,false,0);
if png.Error<> ErrOK then Showmessage('Error');
png.SaveToFile('NewBmp.png');
png.Free;
bmp.Free;
end.
и всеравно не пашет, и даже размер не изменился :(
Кладов (2003-05-31 15:17:00) [10]
> {initializing}
> bmp.PixelFormat:=pf16bit;
bmp.Canvas.Brush.Color := clYellow;> bmp.Canvas.Rectangle(0,0,49,49);
> bmp.Canvas.TextOut(10,10,'PNG Sample');
А что 44 байта, то png просто очень хорошо сжимает черный битмап :)