Delphi中GetPixel和Canvas.Pixels的区别

Delphi中GetPixel和Canvas.Pixels的区别,delphi,Delphi,Api函数“GetPixel”是否比Canvas.Pixels快?它应该是相同的: function TCanvas.GetPixel(X, Y: Integer): TColor; begin RequiredState([csHandleValid]); GetPixel := Windows.GetPixel(FHandle, X, Y); end; 如果您正在寻找比GetPixel/Canvas.Pixel[]性能更好的东西,您应该查看Bitmap.ScanLine。唯一的问题

Api函数“GetPixel”是否比Canvas.Pixels快?

它应该是相同的:

function TCanvas.GetPixel(X, Y: Integer): TColor;
begin
  RequiredState([csHandleValid]);
  GetPixel := Windows.GetPixel(FHandle, X, Y);
end;

如果您正在寻找比GetPixel/Canvas.Pixel[]性能更好的东西,您应该查看Bitmap.ScanLine。唯一的问题是数据可能以多种方式排列,由位图决定。PixelFormat

GetPixel函数非常慢!如果需要高性能(甚至可以接受),则应使用扫描线属性。扫描线[y]是指向位图中第y行像素的指针,按PixelFormat属性指定的格式编码。例如,对于24位位图,该行的格式为

B1 G1 R1 B2 G2 R2。。。Bn Gn Rn


如果位图的宽度为n。Bi、Gi和Ri分别是像素i的蓝色、绿色和红色强度,以字节表示。

@Ritsaert:你确定吗?我刚刚创建了一个小的BMP文件,里面填充了(R,G,B)=(0xFF,0,0),然后在内存中查看它。看见突出显示的字节是第一条扫描线的第一个字节。对我来说,这看起来像是字节变了BBGGRRBBGGRR…我很惭愧。你说得对。24位位图的格式按BGR顺序排列。