Имеется изображение PNG, в котором я сначала читаю разделы описания, а потом через zlib декодирую данные.
После декодирования применяю фильтры, которые находятся в каждой строке первым байтом, как велит описание на 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;
Собственно вопрос: возможно дело в неверном применении фильтров. Кто-нибудь сталкивался с такой проблемой? Если да, в чем может быть дело?
Нет. LibPNG мне не подойдет. Она заточена под c. А у меня Delphi. Переписывать все заголовочники - это зло. К тому же самые запутанные процедуры по считыванию заголовка, поиску IDAT и декомпрессии уже пройдены!
Спасибо! Вещь хорошая, но через VCL. Я как раз хотел от них уйти. Мне требуется загрузить массив пикселей из PNG в память, не более.
XProger
То что надо. Благодарю!
Тема в архиве.