如何循环遍历 TBitmap 上的所有像素并获取像素颜色?

问题描述 投票:0回答:1

我试图循环遍历

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
吗?

delphi bitmap firemonkey delphi-11-alexandria
1个回答
0
投票

尽管您遇到内存不足错误并不令我感到惊讶,但您的代码中存在更严重的问题。通过不在

out of memory
中打印无用数据,可以避免
TMemo
错误。当然,可能有充分的理由打印出少量的像素颜色。

更严重的问题是,尽管

Image1
希望保留位图,但您还是删除了位图。

Bitmap.Free
程序末尾删除
Button1Click
,以及最外面的
try..finally..end
。您的
var Bitmap
的作用只是作为
Image1.Bitmap
的方便本地参考,而不是取得所有权。

© www.soinside.com 2019 - 2024. All rights reserved.