在我的应用程序中,我使用intent
从画廊获取图像文件名,并尝试将其加载到中TImage
。我试图加载它,LoadFromFile
并获取JBitmap
,将其转换为TBitmap
,Assign
然后转换为我的TImage
。这仅适用于最大尺寸为98 x 98像素的位图...如果宽度或高度大于99或98像素,则大多数情况下会出现错误消息“位图尺寸太大”。有时我可以达到250 x 250 ...
即时消息试图找出原因,因为3天...
这是代码:
var
jBitmapD, jSmallBitmap: JBitmap;
BitmapD : TBitmap;
imgW, imgH:Integer;
begin
...
jBitmapD := TJBitmapFactory.JavaClass.decodeFile(StringToJString(imgGallerieChm));
...
jSmallBitmap := TJBitmap.JavaClass.createScaledBitmap(jBitmapD, 98, 98, True);
//jSmallBitmap := TJBitmap.JavaClass.createScaledBitmap(jBitmapD, 101, 101, True);
//jSmallBitmap := TJBitmap.JavaClass.createScaledBitmap(jBitmapD, 1234, 567, True);
...
imgH := jSmallBitmap.getHeight;
imgW := jSmallBitmap.getWidth;
bitmapD := TBitmap.Create; //Work if jSmallBitmap if smaller than 99 x 99
//bitmapD.Create(98,98); //Work if jSmallBitmap if smaller than 99 x 99
//bitmapD.Create(222,333); //Don't work
try
bitmapD.SetSize(imgW,ImgH); //without this, its not working and it should be 99 x 99 or less... most of the time
bitmapD := JBitmapToBitmap(jSmallBitmap);
imgLepObs.Bitmap.Assign(bitmapD);
finally
bitmapD.Free;
end;
如果大多数时候AImage和TBitmap小于99 x 99,则下一个函数起作用
function TfrmMain.JBitmapToBitmap(const AImage: JBitmap): TBitmap;
var
bitmapSurface :TBitmapSurface;
begin
bitmapSurface := TBitmapSurface.Create;
try
if JBitmapToSurface(AImage, bitmapSurface) then
begin
Result.Assign(bitmapSurface);
end;
finally
bitmapSurface.Free;
end;
end;
谢谢您的帮助...我即将放弃...
我尝试使用以下方法缩小位图:
bfOptions.inSampleSize := StrToInt(Edit1.Text); //
bfOptions.inJustDecodeBounds := False;
jSmallBitmap := TJBitmapFactory.JavaClass.decodeFile(StringToJString(imgGallerieChm), bfOptions);
它在大多数情况下都起作用...生成的位图越小,成功的可能性就越大。对于给定的大小,它有时可以工作,有时不能,有时在我重新启动应用程序后就可以工作...
我有一个类似的问题。该问题是针对Android的delphi RTL中的一个已知错误。如果在线程内创建图像,则会出现异常:TBitmap.Create引发“位图大小太大”。这是因为画布工厂无法获得正确的canvastype。它必须由EMB修复。我在一个主线程中创建了位图,现在可以使用了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句