Delphi圖像處理中ScanLine的使用
一般我們在Delphi中進行圖像處理時采用Pixels像素點賦值的方法,Delphi代碼如下:
var
x,y:Integer;
cColor:TColor;
begin
for y:=0 to Image1.Height-1 do
for x:=0 to Image1.Width-1 do
cColor:=Image1.Canvas.Pixels[i,j];
end;
但是這種方法有個缺點,處理速度很慢,小圖像還可以,對于大點的圖像來說就太慢了。
Delphi提供了一種掃描線ScanLine方法是對圖像的一行進行掃描,獲取本行中各像素的內存地址。眾所周知,內存操作肯定會比常規的像素點賦值速度快很多,所以將大大提高圖像的處理速度。
Delphi代碼如下:
var
P:array[0..100] of PByteArray;//像素數組
y:Integer;
begin
for y:=0 to Bmp.Height-1 do
begin
P[y]:=Bmp.ScanLine[y];//將圖片所有像素值存入P
end;
end;
這樣就將一個圖像的所有像素都存入了P這個數組
在SysUtils單元中可以看出PByteArray實際上是一個Byte類型的數組
所以我們聲明的P:array[0..100] of PByteArray;實際上可以看成是一個二維數組
P數組就是一個圖像像素的緩沖區,它的一維是圖像Y坐標,二維是圖像的X坐標。
這樣,如果我們要對圖像的某個像素賦值,例如將第一行、第二列的像素賦值為白色,可用下面的Delphi代碼
var
P:array[0..100] of PByteArray;//像素數組
x,y:Integer;
begin
for y:=0 to Bmp.Height-1 do
begin
P[y]:=Bmp.ScanLine[y];//將圖片所有像素值存入P
end;
y:=0;//第一行
x:=1;//第二列
P[y][x*3]:=255;//像素的第一字節
P[y][x*3+1]:=255;//像素的第二字節
P[y][x*3+2]:=255;//像素的第三字節
end;
上面的代碼中,我們使用的圖像是24位色的(TPixelFormat:=pf24bit),也就是一張真彩色的圖片,pf24bit的圖像中,每個像素在內存中占用三個字節,分別表示RGB值的分量,所以我們可以對三個字節直接賦值
在其它類型的圖像中就不一定能這樣賦值了
TPixelFormat:=pf1bit的圖像(單色圖)中每像素用1位來表示,所以要使用位操作來給像素賦值
TPixelFormat:=pf4bit的圖像中每像素用4位來表示,也要使用位操作來給像素賦值
TPixelFormat:=pf8bit的圖像中每像素用8位來表示,可以使用Byte類型的值給像素賦值,不過這類圖像比較特殊,它的像素值并不是真正的顏色值,而只是調色板上顏色的索引值,這點要注意
TPixelFormat:=pf15bit的圖像也是一種比較特殊的圖像,它每像素用16位來表示,第1位為0,后15位每5位分別表示RGB值,所以也要使用位操作來給像素賦值
TPixelFormat:=pf16bit的圖像中每像素用16位來表示,綠色占6位,其它紅、藍兩種顏色占5位(為什么要這樣?我也不知道,要問制定Bitmap格式的人了,據說是因為人眼對綠色比較敏感)
TPixelFormat:=pf24bit的圖像每個像素用3個字節表示,這就不說了,參看上面的代碼
TPixelFormat:=pf32bit的圖像每個像素用4個字節表示,前面3個字節分別表示RGB值的分量,最后一個字節表示Alpha值

浙公網安備 33010602011771號