[英]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()
的調用。 但是除此之外,我有幾點建議:
您不必創建具有虛假分辨率的位圖,只需從磁盤加載內容即可。 只需使用替代構造函數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
,讓你設置它是如何的圖像將被縮放的財產。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.