簡體   English   中英

Delphi XE4 FireMonkey / iOS DrawBitmap無法正常工作

[英]Delphi XE4 FireMonkey/iOS DrawBitmap not working

因此,通過我的例程,我為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()的調用。 但是除此之外,我有幾點建議:

意見建議

  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上了,但老實說,我不知道您最初打算做什么。 在保持寬高比的同時將位圖粘貼到圖像上嗎? 一個TiImageWrapMode ,讓你設置它是如何的圖像將被縮放的財產。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM