如何有效地获取和设置位图像素
How to efficiently get and set bitmap pixels
我目前正在制作一个应用程序,涉及更改位图中像素的 RGB 值并在之后创建新的位图。
我的问题是我需要帮助提高这个过程的速度。 (使用 inSampleSize = 2
处理位图可能需要几分钟,而处理 inSampleSize = 1
可能需要很长时间)现在,我正在使用 getPixel
和 setPixel
方法来改变像素和相信这两种方法是问题的根源,因为它们效率很低。 getPixels
方法不合适,因为我没有按顺序更改每个像素(例如,获取一个像素并将其周围 5 个像素的半径更改为相同的颜色),除非有人知道使用 getPixels
(或许可以将像素放入一个二维数组中)。
这是我的代码的一部分:
public static final alteredBitmp(Bitmap bp)
{
//initialize variables
// ..................
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
for (int x = 0; x < width; x++) {
int left = Math.max(0, x - RADIUS);
int right = Math.min(x + RADIUS, width - 1);
for (int y = 0; y < height; ++y) {
int top = Math.max(0, y - RADIUS);
int bottom = Math.min(y + RADIUS, height - 1);
int maxIndex = -1;
for (int j = top; j <= bottom; j++) {
for (int i = left; i <= right; i++) {
pixelColor = bitmap.getPixel(i, j);
//get rgb values
//make changes to those values
}
}
}
}
//set new rgb values
bitmap.setPixel(x, y, Color.rgb(r, g, b));
//return new bitmap
非常感谢!
考虑查看 RenderScript,它是 Android 的高性能计算框架。当您遍历宽度 x 高度的像素数并更改每个像素时,在现代设备中可能约为一百万像素或更高,因此在单个线程中执行此操作可能需要几分钟。 RenderScript 可以在可能的情况下在 CPU 或 GPU 上并行化操作。
http://android-developers.blogspot.com/2012/01/levels-in-renderscript.html
http://developer.android.com/guide/topics/renderscript/index.html
Google IO 2013 session:
https://youtu.be/uzBw6AWCBpU
RenderScript 兼容库:http://android-developers.blogspot.com/2013/09/renderscript-in-android-support-library.html
我目前正在制作一个应用程序,涉及更改位图中像素的 RGB 值并在之后创建新的位图。
我的问题是我需要帮助提高这个过程的速度。 (使用 inSampleSize = 2
处理位图可能需要几分钟,而处理 inSampleSize = 1
可能需要很长时间)现在,我正在使用 getPixel
和 setPixel
方法来改变像素和相信这两种方法是问题的根源,因为它们效率很低。 getPixels
方法不合适,因为我没有按顺序更改每个像素(例如,获取一个像素并将其周围 5 个像素的半径更改为相同的颜色),除非有人知道使用 getPixels
(或许可以将像素放入一个二维数组中)。
这是我的代码的一部分:
public static final alteredBitmp(Bitmap bp)
{
//initialize variables
// ..................
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
for (int x = 0; x < width; x++) {
int left = Math.max(0, x - RADIUS);
int right = Math.min(x + RADIUS, width - 1);
for (int y = 0; y < height; ++y) {
int top = Math.max(0, y - RADIUS);
int bottom = Math.min(y + RADIUS, height - 1);
int maxIndex = -1;
for (int j = top; j <= bottom; j++) {
for (int i = left; i <= right; i++) {
pixelColor = bitmap.getPixel(i, j);
//get rgb values
//make changes to those values
}
}
}
}
//set new rgb values
bitmap.setPixel(x, y, Color.rgb(r, g, b));
//return new bitmap
非常感谢!
考虑查看 RenderScript,它是 Android 的高性能计算框架。当您遍历宽度 x 高度的像素数并更改每个像素时,在现代设备中可能约为一百万像素或更高,因此在单个线程中执行此操作可能需要几分钟。 RenderScript 可以在可能的情况下在 CPU 或 GPU 上并行化操作。
http://android-developers.blogspot.com/2012/01/levels-in-renderscript.html
http://developer.android.com/guide/topics/renderscript/index.html
Google IO 2013 session: https://youtu.be/uzBw6AWCBpU
RenderScript 兼容库:http://android-developers.blogspot.com/2013/09/renderscript-in-android-support-library.html