在android中更改图像属性并保存回sdCard

时间:2013-11-20 06:21:35

标签: android image performance image-processing bitmap

我正在尝试开发一个简单的图像编辑器,它将具有旋转图像,裁剪,改变亮度和对比度等基本功能。

由于图像非常大,所以我创建了一个缩小的位图以适应内存 (我在开发人员文档中遵循本教程: - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

保存时我必须在原始图像中进行更改,但在尝试这样做时我会出现内存异常: -

这是我改变亮度的代码: -

public static Bitmap brightness(Bitmap original, int brightness) {
        Bitmap newBitmap = Bitmap.createBitmap(original.getWidth(),
                original.getHeight(), original.getConfig());
        int[] argb = new int[original.getWidth() * original.getHeight()];
        original.getPixels(argb, 0, original.getWidth(), 0, 0,
                original.getWidth(), original.getHeight());
        for (int i = argb.length - 1; i >= 0; --i) {
            int alpha = argb[i] >> 24;
            int red = (argb[i] >> 16) & 0xFF;
            int green = (argb[i] >> 8) & 0xFF;
            int blue = argb[i] & 0xFF;
            int red2 = red + brightness;
            if (red2 > 0xFF)
                red2 = 0xFF;
            if (red2 < 0)
                red2 = 0;
            int green2 = green + brightness;
            if (green2 > 0xFF)
                green2 = 0xFF;
            if (green2 < 0)
                green2 = 0;
            int blue2 = blue + brightness;
            if (blue2 > 0xFF)
                blue2 = 0xFF;
            if (blue2 < 0)
                blue2 = 0;
            int composite = (alpha << 24) | (red2 << 16) | (green2 << 8)| blue2;
            argb[i] = composite;
        }
        newBitmap.setPixels(argb, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight());
        return newBitmap;
    }

这是log cat值: -

java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at java.lang.Thread.run(Thread.java:838)
 Caused by: java.lang.OutOfMemoryError
        at android.graphics.Bitmap.nativeCreate(Native Method)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
        at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
        at com.app.imageeditor.apputils.BitmapHelper.brightness(BitmapHelper.java:26)
        at com.app.imageeditor.activities.ImageActivity$BitmapEditor.doInBackground(ImageActivity.java:307)
        at com.app.imageeditor.activities.ImageActivity$BitmapEditor.doInBackground(ImageActivity.java:1)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:838)

我正在使用异步任务通过调用上面指定的方法

来对原始图像应用更改

帮我摆脱这个!!

2 个答案:

答案 0 :(得分:0)

您可能希望使用BitmapRegionDecoder的内容。 BitmapRegionDecoder允许您处理图像的某些部分。如果您处理非常大的图像,这非常方便。

答案 1 :(得分:0)

在尝试创建新内容之前,您还需要检查内存中是否挂有较旧的位图。

确保在创建新位图的每个实例上调用Bitmap.recycle(),该位图现在不可用。

您还可以使用eclipse提供的MAT工具来分析应用中的整体内存情况。

您的问题没有简单直接的解决方案。它在android中非常棘手,需要进行一些分析。

请在下面找到一些可以帮助您的链接: -

  

http://andmateclipse.blogspot.in/

     

http://android-developers.blogspot.in/2011/03/memory-analysis-for-android.html