BitmapFactory.decodeFile仅在我从电话库中选择图像时才会导致outOfMemoryError,而不是在我选择拍照时使用相机意图拍摄的图像时。我实际上避免在使用相机意图时使用decodeFile。从图库中选择(从意图中获取数据)时,我可以使用相同的方法吗?以下是我以两种方式获取图像的代码:
如果从设备的图库中选择了图片:
if (requestCode == 1)
{
if (intent != null && resultcode == RESULT_OK)
{
ImageHelper ih = new ImageHelper();
mProfilePicPath = ih.getSelectedImageFilePathFromGallery(this, intent);
Bitmap portraitPhoto = ih.getChosenImageFromGallery(mProfilePicPath);
try{
ih.saveImage("Profile pics", portraitPhoto, this);
ImageHelper.getChosenImageFromGallery:
public Bitmap getChosenImageFromGallery(String imagePath) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);
options.inSampleSize = DressingRoomActivity.calculateInSampleSize(options, 500, 500);
options.inJustDecodeBounds = false;
Bitmap portraitPhoto = ImageHelper.convertToPortraitOrientation(options, imagePath);
return portraitPhoto;
}
如果使用相机拍照来选择图像:
else if ((requestCode == CAMERA_REQUEST)&& (resultcode == Activity.RESULT_OK)){
Bundle extras = intent.getExtras();
Uri selectedImage = intent.getData();
if (extras != null) {
ImageHelper ih = new ImageHelper();
mProfilePicPath = ih.getFilePathFromCameraPhoto(this, selectedImage);
Bitmap photo = (Bitmap) intent.getExtras().get("data");
try{
ih.saveImage("Profile pics", photo, this);
正如您所看到的,要从图库中获取图像并从中获取位图,我必须使用此代码options.inSampleSize = DressingRoomActivity.calculateInSampleSize(options, 500, 500);
创建仅500 x 500像素的位图,否则会导致出现outOfMemoryError行Bitmap bmp = BitmapFactory.decodeFile(path, options);
ImageHelper.convertToPortraitOrientation(options, imagePath);
方法中的行。这意味着用户可以从相机中获取图像的AS IS质量,并从图库中的图像获得500px的质量。
我的问题:1)从图库中选择时,有没有办法让我的图像质量达到500px?就像以某种方式避免这一行:Bitmap bmp = BitmapFactory.decodeFile(path, options);
或其他方式?
2)随着画廊我不得不转换成肖像,这只是一个小麻烦,但为什么会这样?如果不这样的话,它会将照片翻转到侧面。
答案 0 :(得分:1)
Here是关于如何Display Bitmaps Efficiently来自官方文档的完整tuto。我遇到了和你一样的问题。我所做的是在返回我的代码之前阅读并理解给定页面中的所有课程。试试这个,你会让事情更加清晰。
修改强>
您的应用程序崩溃了,因为您在主线程中运行Bitmap.decode()
方法。使用另一个线程(使用简单的AsyncTask
)来执行此操作。
答案 1 :(得分:0)
有两种可能的解决方案可以克服outOfMemory异常:
解决方案1:你应该使用像。
这样的弱引用变量WeakReference<Bitmap> weakReferenceBitmap=new
WeakReference<Bitmap>(bitmap);
GC清除weakReference变量与其他变量相比效率更高。
解决方案2:您可以在清单中使用largeHeap属性,然后需要更多的堆空间。
<application
android:largeHeap="true">
</application>
我不建议您使用第二种解决方案,但它有效:)
希望它会有所帮助:)