ПрограммированиеФорумГрафика

Проблемы с применением фильтра в PNG

#0
9:38, 24 окт 2010

Имеется изображение PNG, в котором я сначала читаю разделы описания, а потом через zlib декодирую данные.
Image | Проблемы с применением фильтра в PNG
После декодирования применяю фильтры, которые находятся в каждой строке первым байтом, как велит описание на PNG.
В результате получаю странный результат.
result | Проблемы с применением фильтра в PNG
Код применения фильтров такой:

case TByteArray(p1^)[(Width*dwBytes+1)*j] of
    0: for i := 0 to Width*dwBytes-1 do TByteArray(p^)[j*width*dwBytes+i] := TByteArray(p1^)[j*(width*dwBytes+1)+i+1];
    1: for i := 0 to Width*dwBytes-1 do
       begin
         if i < SampleDepth then TByteArray(p^)[j*width*dwBytes+i] := TByteArray(p1^)[j*(width*dwBytes+1)+i+1] else
         begin
           if TByteArray(p^)[j*width*dwBytes+i-SampleDepth] > 0 then
           TByteArray(p^)[j*width*dwBytes+i] := TByteArray(p1^)[j*(width*dwBytes+1)+i+1]-SampleDepth else
           TByteArray(p^)[j*width*dwBytes+i] := 0;
         end;
       end;
    2: begin
         if j = 0 then
         for i := 0 to Width*dwBytes-1 do TByteArray(p^)[j*width*dwBytes+i] := TByteArray(p1^)[j*(width*dwBytes+1)+i+1] else
         for i := 0 to Width*dwBytes-1 do TByteArray(p^)[j*width*dwBytes+i] := TByteArray(p1^)[j*(width*dwBytes+1)+i+1]+
         TByteArray(p1^)[j*(width*dwBytes)+i+1];
    end;
end;

Собственно вопрос: возможно дело в неверном применении фильтров. Кто-нибудь сталкивался с такой проблемой? Если да, в чем может быть дело?

#1
10:47, 24 окт 2010

http://www.libpng.org/pub/png/libpng.html

#2
10:59, 24 окт 2010

Нет. LibPNG мне не подойдет. Она заточена под c. А у меня Delphi. Переписывать все заголовочники - это зло. К тому же самые запутанные процедуры по считыванию заголовка, поиску IDAT и декомпрессии уже пройдены!

#3
13:16, 24 окт 2010

http://delphi.pjh2.de/articles/graphic/png.php

#4
13:31, 24 окт 2010

Спасибо! Вещь хорошая, но через VCL. Я как раз хотел от них уйти. Мне требуется загрузить массив пикселей из PNG в память, не более.

#5
18:34, 24 окт 2010

http://code.google.com/p/joim/source/browse/trunk/src/jimg.pas#150

#6
18:38, 24 окт 2010

XProger
То что надо. Благодарю!

ПрограммированиеФорумГрафика

Тема в архиве.