Код:
procedure TSGIImage.SetColor(X, Y:integer; R,G,B:byte; A:byte=255);
var ba:PByteArray; //указатели на строку Y изображения
p:PRGBTriple;
q:PRGBQuad;
begin
if Bitmap.PixelFormat=pf8bit then //если изображение монохромное 8бит
begin
ba := PByteArray(Bitmap.ScanLine[Y]); //получаем адрес строки Y
ba[X]:=R; //Задаем значение пикселя X, находящегося по адресу ba[X]
end
else if Bitmap.PixelFormat=pf24bit then //если цветное 24бит
begin
DWORD(p) := DWORD(Bitmap.ScanLine[Y]) + (X * SizeOf(TRGBTriple)); //значение указателя := Адрес Y строки + смещение на X пикселей
p.rgbtRed:=R; //Задаем значения пикселя X, находящегося по адресу p
p.rgbtGreen:=G;
p.rgbtBlue:=B;
end
else if Bitmap.PixelFormat=pf32bit then //если цветное с прозрачностью
begin
DWORD(q) := DWORD(Bitmap.ScanLine[Y]) + (X * SizeOf(TRGBQuad)); //значение указателя := Адрес Y строки + смещение на X пикселей
q.rgbtRed:=R; //Задаем значения пикселя X, находящегося по адресу q
q.rgbtGreen:=G;
q.rgbtBlue:=B;
q.rgbtAlpha:=A;
end;
end;
в указателе хранится адрес переменной/объекта, при этом адрес, на который указвает указатель, можно менять. поэтому с их помощью можно заполнить значениями строку картинки, получив один раз адрес строки, и после заполнения очередного пикселя просто сдвигать указатель на размер пикселя, т.е. что-то типа
Код:
X:=0;
DWORD(p) := DWORD(Bitmap.ScanLine[Y]); //получаем адрес строки
repeat
p.rgbtRed:=R; //Задаем значения пикселя
p.rgbtGreen:=G;
p.rgbtBlue:=B;
X:=X+1;
DWORD(p) := DWORD(p) + (X * SizeOf(TRGBTriple)); //сдвигаем указатель
until x>=Bitmap.Width;