因此,通过我的例程,我为在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。

最佳答案

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

if yourCanvas.BeginScene() then
    try
        yourCanvas.DrawBitmap(..);
    finally
        yourCanvas.EndScene();
    end;
就是这样:您只是缺少对BeginScene()EndScene()的调用。但除此之外,我有几点建议:
意见建议
  • 您不必创建具有虚假分辨率的位图,只需从磁盘加载内容即可。只需使用替代构造函数TBitmap.CreateFromFile(const AFileName: string)即可。
  • 您还需要确保FBitmapBuffer指向有效的TBitmap对象。您应该插入像if not Assigned(FBitmapBuffer) then FBitmapBuffer := TBitmap.Create(..);这样的支票
  • 此外,您每次都会创建一个新的TBitmap对象,并且在完成工作后不会释放它。每次调用过程时,您的内存都会被TBitmaps填满,您将再也看不到它。您应该在过程结束时释放它。
  • 另外,您确定要例如将新位图的宽度设置为Round(TmpNW)吗?我想您应该输入Trunc(TmpNW)代替。
  • 为什么要使用firemonkey组件的位图从磁盘而不是FBitmapBuffer对象加载图像?
  • 最后:尽管我们现在已经可以将位图粘贴到TImage上了,但老实说,我不知道您最初打算做什么。在保持宽高比的同时将位图粘贴到图像上吗? TiImage具有WrapMode属性,可让您设置图像的缩放比例。
  • 10-05 20:03