Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизОбработка 32-битного PNG с помощью ScanLine Найти похожие ветки
← →
Jimmy (2012-04-11 14:12) [0]Не удается обработать 32-битный PNG с альфа-каналом следующим кодом:
procedure TForm1.Button1Click(Sender: TObject);
const
MaxPixelCountA = MaxInt div SizeOf(TRGBQuad);
type
PRGBAArray = ^TRGBAArray;
TRGBAArray = array[0..MaxPixelCountA-1] of TRGBQuad;
Var RowFrom : PRGBAArray;
R,G,B,T:Byte;
i,j:Integer;
PG:TPNGObject;
begin
PG:=TPNGObject.Create;
PG.LoadFromFile("1.png");
For i := PG.Height-1 downto 0 do
begin
RowFrom := pRGBAArray(PG.Scanline[i]);
for j:=0 to PG.Width-1 do
begin
R :=RowFrom[j].rgbRed;
G :=RowFrom[j].rgbGreen;
B :=RowFrom[j].rgbBlue;
begin T:=R; R:=B; B:=T; end;
end;
RowFrom[j].rgbRed:=R;
RowFrom[j].rgbGreen:=G;
RowFrom[j].rgbBlue:=B;
end;
Form1.Canvas.Draw(10,10,PG);
PG.Free;
end;
Подскажите, почему? Использую компонент PNGImage. Заранее спасибо!
← →
CRLF (2012-04-11 14:30) [1]Что конкретно не удаётся?
← →
Jimmy (2012-04-11 14:32) [2]PNG-рисунок не изменяется, но появляются какие-то лишние полосы.
← →
Jimmy (2012-04-11 15:10) [3]А по задумке должны меняться красная и синяя составляющие каждого пикселя.
← →
icWasya © (2012-04-11 15:38) [4]Ну вот сам же написал
for j:=0 to PG.Width-1 do // цикл по строке
begin // начало тела цикла
R :=RowFrom[j].rgbRed;
G :=RowFrom[j].rgbGreen;
B :=RowFrom[j].rgbBlue;
begin T:=R; R:=B; B:=T; end; // что-то с чем-то поменяли местами
end; // конец цикла
// следующий код выполнится только когда дойдём до конца строки
// и к этому времени переменная j будет иметь неопределённое значение
RowFrom[j].rgbRed:=R;
RowFrom[j].rgbGreen:=G;
RowFrom[j].rgbBlue:=B;
// итого присвоение будет идти непонятно куда
//
← →
Jimmy (2012-04-11 15:43) [5]Это, конечно, я глупо ошибся. Однако, если операторные скобки закрыть правильно, все равно не работает!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.075 c