繁体   English   中英

在图像视图中旋转两次以获取图库中的高质量图像时,Android应用程序崩溃

[英]Android app crashes when rotated twice in image view for high quality images from gallery

  1. 低质量图像(小于300 KB)没有问题
  2. 单个+90、180或270度旋转没有问题。
  3. 仅当高质量图像在图像视图中旋转两次以上时,应用崩溃

     private void setupListeners() { rotateLeft.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { *imageBitmap = Util.ImageProcess.rotateImage(imageBitmap, 270);* showImage.setImageBitmap(imageBitmap); } }); rotateRight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { imageBitmap = Util.ImageProcess.rotateImage(imageBitmap, 90); showImage.setImageBitmap(imageBitmap); } }); flip.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { imageBitmap = Util.ImageProcess.rotateImage(imageBitmap, 180); showImage.setImageBitmap(imageBitmap); } }); continueButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { saveRotatedImage(); Util.MediaScanner.galleryAddPic(getApplicationContext(),imageFile.getAbsolutePath()); startNextActivity(); } }); 

    }

另外,对于旋转:

public static class ImageProcess{

    public static Bitmap rotateImage(Bitmap source, float angle) {

        Bitmap bitmap = null;
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        try {
            bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(),
                source.getHeight(), matrix, true);
        } catch (OutOfMemoryError err) {
            err.printStackTrace();
        }
        return bitmap;

在清单文件中的application标签中添加一个属性,以允许largeheap = true可能会帮助您尝试一下。

我终于找到了解决方案。 代码是:

   int imageHeight = imageBitmap.getHeight();

    int imageWidth = imageBitmap.getWidth();

    int newImageheight;

    int newImageWidth;

    if (imageHeight <= imageWidth){

        newImageWidth = 1200;
        //getting the length and setting it 1200

        newImageheight = (1200*imageWidth)/imageHeight;
        //getting image ratio and multiplying it by the length which
        //gives width              

    }

    else {
        newImageheight = 1200;

        newImageWidth = (1200*imageHeight)/imageWidth;

    }

   imageBitmap = Bitmap.createScaledBitmap(imageBitmap,
        newImageheight, newImageWidth, false);
    //setting the new scaled image in lower quality

这样可以防止OutOfMemoryError。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM