Советы по Delphi

       

Bitmap.Scanline для PixelFormat=pf1bit, pf8bit, pf24bit (Техника программирования в Delphi 3)


Кто-то из Италии попросил меня пример использования pf1bit в изображениях (Bitmaps), я послал часто ответа из имеющихся заготовок, подумал, и добавил здесь другие детали для pf8bit и pf24bit.

Общее

Новое в Delphi 3 свойство scanline допускает быстрый доступ к отдельным пикселям, но необходимо указать с каким Bitmap.PixelFormat вы работаете, прежде чем сможете иметь доступ к пикселям.

Возможные PixelFormats включают:

  1. pfDevice
  2. pf1bit
  3. pf4bit
  4. pf8bit
  5. pf15bit
  6. pf16bit
  7. pf24bit
  8. pf32bit
pf24bit-изображения

Для 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;
<

Содержание  Назад  Вперед







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий