我试图循环遍历
TBitmap
图像上的所有像素,然后在 TMemo
组件中显示所有颜色。
我有一个简单的 GUI,其中包含一个
TImage
,其中包含我想要循环遍历所有像素的图像,然后是一个 TButon
,其中包含一个将执行循环的单击事件。然后显然还有 TMemo
将它们显示到:
我尝试了很多不同的代码来循环位图像素,但这是我尝试过的最新代码:
procedure TForm1.Button1Click(Sender: TObject);
var
BitmapData: TBitmapData;
begin
Memo1.Lines.Clear;
var Bitmap := Image1.Bitmap;
try
if Bitmap.Map(TMapAccess.ReadWrite, BitmapData) then
begin
try
for var Y := 0 to Bitmap.Height - 1 do
begin
for var X := 0 to Bitmap.Width - 1 do
begin
var PixelColor := BitmapData.GetPixel(X, Y);
Memo1.Lines.Add('X: ' + X.ToString + ' | Y: ' + Y.ToString + ' | ' + AlphaColorToString(PixelColor))
end;
end;
finally
Bitmap.Unmap(BitmapData);
end;
end;
finally
Bitmap.Free;
end;
end;
上面的代码给了我一个
out of memory
例外:
项目引发异常类 EOutOfMemory,并显示消息“内存不足”。
有人可以帮我编写代码来循环 TBitmap 上的每个像素并获取该像素的
TAlphaColor
吗?
尽管您遇到内存不足错误并不令我感到惊讶,但您的代码中存在更严重的问题。通过不在
out of memory
中打印无用数据,可以避免 TMemo
错误。当然,可能有充分的理由打印出少量的像素颜色。
更严重的问题是,尽管
Image1
希望保留位图,但您还是删除了位图。
从
Bitmap.Free
程序末尾删除 Button1Click
,以及最外面的 try..finally..end
。您的 var Bitmap
的作用只是作为 Image1.Bitmap
的方便本地参考,而不是取得所有权。