我的image_source
是源位图,带有一些图片和image_new
- 临时位图
我执行此代码,使image_source
成为立体照片背景图层:
int [] pixel = {0x0, 0x0, 0x0};
int [] image_params = {image_source.getWidth() - 2 * anaglyph_amplitude, image_source.getHeight()};
Bitmap image_new = Bitmap.createScaledBitmap(image_source, image_params[0], image_params[1], false);
for(int i = 0; i < image_params[0]; ++i)
for(int j = 0; j < image_params[1]; ++j) {
pixel[0] = image_source.getPixel(i, j);
pixel[1] = image_source.getPixel(i + 2 * anaglyph_amplitude, j);
pixel[2] = pixel[0] + pixel[1] % 0x10000 - pixel[0] % 0x10000;
image_new.setPixel(i, j, pixel[2]);
}
image_source = Bitmap.createBitmap(image_new);
image_new = null;
然后将image_source
绘制到画布上(绘制到画布上的那些不可用)。
问题是这个程序在智能Android设备上处理1000x1000大小的图像大约需要5秒钟。
还有其他方法可以运行位图像素吗?
答案 0 :(得分:0)
代码段代码有一些性能增强。我不确定这对你来说是否足够。
首先改变
pixel[2] = pixel[0] + (pixel[1] & 0xFFFF) - (pixel[0] & 0xFFFF);
而不是
pixel[2] = pixel[0] + pixel[1] % 0x10000 - pixel[0] % 0x10000;
-
pixel[1] = image_source.getPixel(i + (anaglyph_amplitude<<1), j);
而不是
pixel[1] = image_source.getPixel(i + 2 * anaglyph_amplitude, j);
答案 1 :(得分:0)
另一个小调整。在内部循环中,没有理由将数组用于像素[1]等。有三个整数,p0,p1和p2。
编辑添加
我对Android的熟悉程度不如Swing,但我希望Android的Bitmap有一个“一次让我得到一堆像素”的方法,类似于Raster。确实如此。
我认为您应该使用位图方法javadocs link here
public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)
如果您有可用内存,请立即获取所有1,000,000个内存。
答案 2 :(得分:0)
您可以缓存2 * anaglyph_amplitude
的计算,以便不必在每次迭代时计算。
答案 3 :(得分:0)
这是解决方案:我得到像素数组并使用它。
int [] pixel = {0x0, 0x0, 0x0};
int [] pixels_old, pixels_new;
int [] params = {image_source.getWidth(), image_source.getHeight()};
int [] image_params = {image_source.getWidth() - 2 * anaglyph_amplitude, image_source.getHeight()};
pixels_old = new int[params[2] * params[3]];
pixels_new = new int[image_params[0] * image_params[1]];
image_source.getPixels(pixels_old, 0, params[2], 0, 0, params[2], params[3]);
image_source = null;
for(int i = 0; i < image_params[0]; ++i)
for(int j = 0; j < image_params[1]; ++j) {
pixel[0] = pixels_old[i + j * params[2]];
pixel[1] = pixels_old[i + (anaglyph_amplitude<<1) + j * params[2]];
pixel[2] = pixel[0] + (pixel[1] & 0xFFFF) - (pixel[0] & 0xFFFF);
pixels_new[i + j * image_params[0]] = pixel[2];
}
pixels_old = null;
image_source = Bitmap.createBitmap(pixels_new, image_params[0], image_params[1], Bitmap.Config.ARGB_8888);
pixels_new = null;