如何以最少的内存使用裁剪位图?
Posted
技术标签:
【中文标题】如何以最少的内存使用裁剪位图?【英文标题】:How to crop a Bitmap with a minimum usage of memory? 【发布时间】:2012-03-08 14:17:22 【问题描述】:在我的应用程序中,我从网上加载了大量图片。到目前为止一切正常:
@Override
public void onSuccess( byte[] response )
Bitmap image = BitmapFactory.decodeByteArray( response, 0, response.length, options );
...
但事实上,在申请过程中只使用图像的提取物会很好。所以我尝试了这样的事情:
@Override
public void onSuccess( byte[] response )
Bitmap source = BitmapFactory.decodeByteArray( response, 0, response.length, options );
Bitmap image = Bitmap.createBitmap( source, 0, 0, source.getWidth(), source.getHeight() - 30 );
source.recycle();
source = null;
...
但我的应用在加载了几十张图片后不断崩溃 (OutOfMemoryException)。所以(我猜)我有两次机会摆脱 30 像素的高度(这实际上是一个信用信息,但别担心,我不是在窃取,我隐藏它就可以了):
以更少的内存使用裁剪和保存图像,或者 操作 ImageView 以隐藏图像底部(高度可能因缩放而有所不同)但我需要一些关于这些技术的建议。
【问题讨论】:
等一下,你已经在做的不是裁剪图像吗? 【参考方案1】:试试这样的:
private Bitmap trimImage(Bitmap source)
int trimY = 20; //Whatever you want to cut off the top
Bitmap bmOverlay = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
Canvas c = new Canvas(bmOverlay);
//Source and destination Rects based on sprite animation.
Rect srcRect = new Rect(0, trimY, source.getWidth(), source.getHeight());
Rect dstRect = new Rect(0, 0, source.getWidth(), source.getHeight());
c.drawBitmap(manual1, srcRect, dstRect, null);
return bmOverlay;
这还没有经过测试,但这样的事情可能会奏效。
【讨论】:
【参考方案2】:使用位图节省内存的一种常见方法是将图像解码到一个预先缩放以适合您的目的的空间。这是一个(可能也是)简单的example。 (更好的方法是将比例因子限制为 2 的幂。)
【讨论】:
我已经在我的应用程序中考虑了这些 BitmapFacotry 选项。但现在我需要裁剪(而不是缩放)现有的位图。如果不导致 OutOfMemoryException,我就无法完成。【参考方案3】:请使用此代码
ImageView image = (ImageView) findViewById(R.id.sd);
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ss);
Bitmap bMapScaled = Bitmap.createScaledBitmap(bMap, 180, 220, true);
image.setImageBitmap(bMapScaled);
在这个例子中,图像“ss”将缩放或调整它帮助你的东西
【讨论】:
我试过了,但是 createScaledBitmap 会缩放图像。我想裁剪它(从图像中剪下一部分)。无论如何它并不能解决内存问题。以上是关于如何以最少的内存使用裁剪位图?的主要内容,如果未能解决你的问题,请参考以下文章