[顏色篇]
在上一篇中提到了,那灰度化代碼只能適用于24位色(PixelFormats=pf24bit),為什么?看看記錄類型tagRGBTRipLE,正好24位,所以這樣只能處理24位色圖!
那怎么處理其他的位圖呢?
先對這各種類型的位圖做些簡單的介紹~~~
pf1bit:
每個像素只需要用一位表示,如調色板定義的是黑白兩種顏色(0為黑,1為白),這時只能用位操作訪問像素信息!如定義
var P:PByte
  for Y := 0 to (Bitmap.Height - 1) do
  begin
    p := Bitmap.ScanLine[Y];
    for X := 0 to (Bitmap.width - 1) DIV 8 + 1 do
    begin
      p^:=1 or 2 or 4 or 8 or 16 or 32 or 64 or 128;
      Inc(PRGB,3);
    end;
  end;
 p^:=1 or 2 or 4 or 8 or 16 or 32 or 64 or 128;
 這行代碼什么意思呢?1=1(二進制),2=10(二進制),4=100(二進制),8=1000(二進制)...
結合上篇中解釋了的或運算,很容易理解就以八個字位為單位,給其賦上顏色信息!
pf4bit:
和pf1bit位圖一樣,操作pf4bit位圖也需要用位操作。
pf8bit:
可直接利用Byte、TByteArray,但用Scanline取的值表示的只是調色板上顏色的索引。
pf15bit和pf16bit:
這兩種位圖都是16位的,pf15bit是第一位為0,后15位的每5位分別表示紅、綠、藍。而pf16bit中綠色占6位,其它兩種顏色占用5位(人眼對綠色比較敏感)!
pf24bit位圖轉pf15bit位圖代碼
 var
  Row24:pRGBTriple; 
  Row15:PWord;
 for j := 0 TO Bitmap.Height-1 DO
 begin
   Row15 := Bitmap15.Scanline[j];
   Row24 := Bitmap24.Scanline[j];
   for i := 0 TO Bitmap.Width-1 DO
   begin
     with Row24^ do
       Row15^ := (rgbtRed Shr 3) Shl 10 or (rgbtGreen Shr 3) Shl 5 or (rgbtBlue Shr 3);
     Inc(Row24);
     Inc(Row15);
   end
 end;
pf24bit和pf32bit:
  
 pf24bit上面的已多次用到,就不多說了。而pf32bit和pf24bit一樣,用24位來記錄三原色的顏色信息! 
 PRGBQuad = ^TRGBQuad;
 tagRGBQUAD = packed record
  rgbBlue: Byte;
  rgbGreen: Byte;
  rgbRed: Byte;
  rgbReserved: Byte;
 end;
 TRGBQuad = tagRGBQUAD;
如果要修改上面的程序,就是簡單的PRGBQuad替換PRGBTriple,TRGBQuad替換TRGBTriple的過程~
測試表明在pf32bit中利用Scanline處理圖像要比pf24bit快。
所以除了單色圖(PixelFormats=pf1bit)外(沒必要),其它都可轉外32位色實現灰度化。這也是一種比較可行的方法!
| 
 
 | 
新聞熱點
疑難解答