JAVA运行和处理位图上每个像素的最快方法是什么?

JAVA运行和处理位图上每个像素的最快方法是什么?,java,android,bitmap,anaglyph-3d,Java,Android,Bitmap,Anaglyph 3d,我有image\u source这是带有一些图片的源位图和image\u new临时位图 我这样做的代码,使image\u source成为浮雕背景层: int [] pixel = {0x0, 0x0, 0x0}; int [] image_params = {image_source.getWidth() - 2 * anaglyph_amplitude, image_source.getHeight()}; Bitmap image_new = Bitmap.createScaledBit

我有
image\u source
这是带有一些图片的源位图和
image\u new
临时位图

我这样做的代码,使
image\u 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;
int[]像素={0x0,0x0,0x0};
int[]image_params={image_source.getWidth()-2*立体轮廓振幅,image_source.getHeight()};
位图image\u new=Bitmap.createScaledBitmap(图像源,图像参数[0],图像参数[1],false);
对于(int i=0;i
然后,
image\u source
被绘制到画布上(在一处绘制到画布不可用)

问题是这个程序在智能安卓设备上处理1000x1000大小的图像大约需要5秒钟


运行位图像素还有其他方法吗?

代码片段的性能有一些增强。我不确定这对你来说是否足够

第一次改变

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 + 2 * anaglyph_amplitude, j);
-


另一个小调整。在内环中,没有理由为像素[1]等使用数组。有三个int,p0、p1和p2

编辑添加

与Swing相比,我对Android不太熟悉,但我希望Android的位图有一种类似于光栅的“一次给我一堆像素”的方法。是的

我认为你应该使用位图方法


如果您有可用内存,请立即获取所有1000000

您可以缓存
2*立体图形振幅的计算,这样就不必在每次迭代时都计算它。

这里有一个解决方案:我得到像素数组并使用它

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;
int[]像素={0x0,0x0,0x0};
int[]旧像素,新像素;
int[]params={image\u source.getWidth(),image\u source.getHeight()};
int[]image_params={image_source.getWidth()-2*立体轮廓振幅,image_source.getHeight()};
像素旧=新整数[params[2]*params[3]];
像素新=新整数[图像参数[0]*图像参数[1]];
image_source.getPixels(pixels_old,0,params[2],0,0,params[2],params[3]);
图像_源=空;
对于(int i=0;ipixel[1]=pixels\u old[i+(立体图\u Amplitude)在图像处理时也有同样的问题。处理时间太长。我想在scollbar上处理(在搜索栏进度更改上)。请参阅下面的答案,但简短的摘要是使用getPixels()一次抓取一堆像素。只有getPixel的循环需要很多时间time@Finesse-请参阅编辑。我发现一个API调用可以一次获取所有像素,而不是调用getPixel()1000 X 1000次。没有明显区别。我做了实验:我更改了
pixel[0]=image\u source.getPixel(I,j);
取代循环中的整个代码;结果是相同的,因为它能够在一个快速的单个操作中获得整个像素的颜色?实时诊断消耗部分代码。打印循环前、循环后以及创建位图后的时间戳()热点c2上的@user94?当然,但是你知道android的JIT有多好吗?(假设是android2.2+版本)不知道这是否有CSE。好!有多快?很高兴我们找到了getPixels()。
public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)
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;