1

因此,通过我的例程,我计算了我想要的 TImage 内显示的 TBitmap ( ABitmap ) 的新宽度/高度。

这是调整大小和绘制ABitmap的代码

var
  TmpScale: Double;
  TmpNH: Single;
  TmpNW: Single;
  P: string;
begin      
  P := FAppDataDirPath + 'Library' + PathDelim + 'assets' + PathDelim + 'app_header.png';
  if FileExists(P) then
    begin
      ImageLogo.Bitmap := TBitmap.Create(1,1);
      ImageLogo.Bitmap.LoadFromFile(P);

      TmpScale := ImageLogo.Width / ImageLogo.Bitmap.Width;
      TmpNW := ImageLogo.Bitmap.Width * TmpScale;
      TmpNH := ImageLogo.Bitmap.Height * TmpScale;

      FBitmapBuffer.Width := Round(TmpNW);
      FBitmapBuffer.Height := Round(TmpNH);
      FBitmapBuffer.Canvas.DrawBitmap(ImageLogo.Bitmap, RectF(0,0,ImageLogo.Bitmap.Width,ImageLogo.Bitmap.Height), RectF(0,0,TmpNW,TmpNH), 255);
      ImageLogo.Bitmap.Assign(FBitmapBuffer);

我得到的只是一个显示 TImage 的完全空白区域。

4

1 回答 1

6

看一下TCanvas.BeginScene(..):在画布上绘画之前,您必须开始场景,然后再结束

if yourCanvas.BeginScene() then
    try
        yourCanvas.DrawBitmap(..);
    finally
        yourCanvas.EndScene();
    end;

差不多就是这样:您只是错过了对BeginScene()and的调用EndScene()。但除此之外,我有几个建议:

建议

  1. 您不必创建具有虚假分辨率的位图,只需从磁盘加载内容。只需使用替代构造函数TBitmap.CreateFromFile(const AFileName: string)

  2. 您还需要确保 FBitmapBuffer 指向一个有效的TBitmap对象。您应该插入一张支票,例如if not Assigned(FBitmapBuffer) then FBitmapBuffer := TBitmap.Create(..);

  3. 此外,您每次都在创建一个新的 TBitmap 对象,并且在您的工作完成后您不会释放它。每次调用您的程序时,您的内存都会被您永远不会再看到的 TBitmaps 填满。您应该在程序结束时释放它。

  4. 另外,您确定例如将新位图的宽度设置为Round(TmpNW)您想要的吗?我猜你本来是要打字的Trunc(TmpNW)

  5. 为什么你使用你的 firemonkey 组件的位图从磁盘而不是你的FBitmapBuffer对象加载图像?

  6. 最后:尽管我们TImage现在将位图粘贴到工作中,但老实说,我真的不知道您首先要做什么。在保持纵横比的同时将位图粘贴到图像上?ATiImage有一个WrapMode属性,可让您设置其图像的缩放方式。

于 2013-07-17T21:07:05.470 回答