【问题标题】:TImage picture disappears when reading its canvas?TImage图片在阅读其画布时消失?
【发布时间】:2013-01-10 10:53:20
【问题描述】:

我在表单上有一个简单的TImage 控件。我在设计时分配了一个位图图像。运行时,我使用TImage.Picture.Bitmap.Canvas 读取画布。一切正常。然后,我在设计时加载 JPEG 图像。然而,现在当我读到这幅画布时,画面突然消失了。

为什么会发生这种情况,我该如何避免?

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  Canvas: TCanvas;
begin
  Canvas:= Image1.Picture.Bitmap.Canvas;
  //Do something with Canvas, but canvas is empty and image disappeared
end;

【问题讨论】:

  • 您尝试过不同的 JPEG 吗?也许JPEG有一些缺陷???

标签: delphi canvas delphi-xe2 timage


【解决方案1】:

这是意料之中的,因为 JPG 图像根本不是位图 (BMP) 图像。

您必须将其转换为位图才能对其进行处理:

var
  bm: TBitmap;
begin
  bm := TBitmap.Create;
  try
    bm.Assign(Image1.Picture.Graphic);
    bm.Canvas.DoSomethingReallyAwesome(ttExtraAwesome);
    bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\test5.bmp');
  finally
    bm.Free;
  end;

【讨论】:

  • 嗯,我会假设(确实假设)在设计时加载它会将其转换为位图,因为位图是访问图像的唯一门(我知道)那是在图片对象中。是的,我知道如何转换如上所示的格式,我只是觉得奇怪的是 TImageTPicture 不会包含此内容。但是我错过了您提供的Graphic 参考。
  • @JerryDodge:由于TPicture 支持多种图像格式,通过其Graphic 属性,无需将设计时加载的图像不必要地转换为位图。
  • 这种转换不仅没有必要,而且还很糟糕。假设您在应用程序中包含太阳系中每个行星的 1920×1080 光栅图像。如果图像是 (1) JPG 或 (2) BMP,则 EXE 的文件大小是多少?
猜你喜欢
  • 2011-02-18
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多