Показать сообщение отдельно
  #3  
Старый 02.11.2010, 14:26
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Код:
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;
__________________
РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت
Ответить с цитированием