我正在尝试开发一个简单的图像编辑器,它将具有旋转图像,裁剪,改变亮度和对比度等基本功能。
由于图像非常大,所以我创建了一个缩小的位图以适应内存 (我在开发人员文档中遵循本教程: - 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)
我正在使用异步任务通过调用上面指定的方法
来对原始图像应用更改帮我摆脱这个!!
答案 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