[顏色篇]
在上一篇中提到了,那灰度化代碼只能適用於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位色實現灰度化。這也是一種比較可行的方法!