我要制作像 Retrica
这样的应用问题是我对图像应用了一些过滤器或效果,它会导致java.lang.OutOfMemoryError并花费更多时间来应用于图像。
public class ImageEnhancemeane extends AppCompatActivity {
private static final int[] FROM_COLOR = new int[]{49, 179, 110};
private static final int THRESHOLD = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_enhancemeane);
ImageView imgStatus = (ImageView) findViewById(R.id.backImage);
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.testimg);
imgStatus.setImageBitmap(createSepiaToningEffect(bm, 2, 0.2, 0.5, 0.59));
}
public static Bitmap createSepiaToningEffect(Bitmap src, int depth, double red, double green, double blue) {
// image size
int width = src.getWidth();
int height = src.getHeight();
// create output bitmap
Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig());
// constant grayscale
final double GS_RED = 0.3;
final double GS_GREEN = 0.59;
final double GS_BLUE = 0.11;
// color information
int A, R, G, B;
int pixel;
// scan through all pixels
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
// get pixel color
pixel = src.getPixel(x, y);
// get color on each channel
A = Color.alpha(pixel);
R = Color.red(pixel);
G = Color.green(pixel);
B = Color.blue(pixel);
// apply grayscale sample
B = G = R = (int) (GS_RED * R + GS_GREEN * G + GS_BLUE * B);
// apply intensity level for sepid-toning on each channel
R += (depth * red);
if (R > 255) {
R = 255;
}
G += (depth * green);
if (G > 255) {
G = 255;
}
B += (depth * blue);
if (B > 255) {
B = 255;
}
// set new pixel color to output image
bmOut.setPixel(x, y, Color.argb(A, R, G, B));
}
}
src.recycle();
src = null;
// return final image
return bmOut;
}
}
这是createSepiaToningEffect()方法是我的过滤器,它对图像应用了一些效果,但它会导致OutOfMemoryError。
我将在清单中使用largeheap = true解决OutOfMemoryError,但我想要更好的解决方案。
当我调用过滤器并对图像应用一些效果时需要一些时间。
请给出一些可靠的解决方案。
答案 0 :(得分:1)
Here是Google必须说的:
但是,请求大堆的功能仅适用于a 一小组应用程序,可以证明需要消耗更多的RAM(例如 作为一个大型照片编辑应用程序)。永远不要简单地请求大堆 因为你的内存不足而需要快速修复
避免使用位图浪费内存
加载位图时,只能以您需要的分辨率将其保存在RAM中 对于当前设备的屏幕,如果原始屏幕缩小它 位图是一个更高的分辨率。请记住,位图的增加 分辨率导致所需的内存相应(增加2), 因为X和Y尺寸都增加了。
为了更好地处理图像和内存,请提供以下开发人员建议:
Loading Large Bitmaps Efficiently
另外,建议您考虑使用一些Android图像库进行图像处理和加载。例如。毕加索,Fresco,Glide。每个人都有自己的优点和缺点。选择最适合您的方式并最适合您的需求,以下帖子可以指导您正确的方向。
Picasso v/s Imageloader v/s Fresco vs Glide
Comparison of Image Library for Android (Picasso, Fresco, etc.)