Общее
Новое в Delphi 3 свойство scanline допускает быстрый доступ к отдельным пикселям, но необходимо указать с каким Bitmap.PixelFormat вы работаете, прежде чем сможете иметь доступ к пикселям.
Возможные PixelFormats включают:
Для pf24bit-изображений необходимо определить:
CONSTPixelCountMax = 32768; TYPEpRGBArray = ^TRGBArray;TRGBArray = ARRAY[0..PixelCountMax-1] OF TRGBTriple; |
Примечание: TRGBTriple определен в модуле Windows.PAS.
Для того, чтобы к существующему 24-битному изображению иметь доступ как к изображению, созданному с разрешением 3 байта на пиксел, сделайте следующее:
...VARi : INTEGER;j : INTEGER;RowOriginal : pRGBArray;RowProcessed: pRGBArray;BEGINIF OriginalBitmap.PixelFormat <> pf24bitTHEN RAISE EImageProcessingError.Create('GetImageSpace: ' +'Изображение должно быть 24-х битным.'); {Шаг через каждую строчку изображения.}FOR j := OriginalBitmap.Height-1 DOWNTO 0 DOBEGINRowOriginal := pRGBArray(OriginalBitmap.Scanline[j]);RowProcessed := pRGBArray(ProcessedBitmap.Scanline[j]); FOR i := OriginalBitmap.Width-1 DOWNTO 0 DOBEGIN // Доступ к RGB-цветам отдельных пикселей должен осуществляться следующим образом:// RowProcessed[i].rgbtRed := RowOriginal[i].rgbtRed; // RowProcessed[i].rgbtGreen := RowOriginal[i].rgbtGreen; // RowProcessed[i].rgbtBlue := RowOriginal[i].rgbtBlue; END END... |
pf8bit-изображения
Доступ к такому формату изображения легко получить, используя TByteArray (определен в SysUtils.PAS):
PByteArray = ^TByteArray;TByteArray = array[0..32767] of Byte; |
(Я думаю (но сам этого не пробовал), что вы сможете получить доступ к pf16bit-изображениям, используя следующие определения в SysUtils.PAS:
PWordArray = ^TWordArray;TWordArray = array[0..16383] of Word; |