更高效的RGB到ARGB转换

时间:2013-03-27 19:29:32

标签: java android graphics rgb argb

我有这个工作代码,它读取700x700 RGB24 TIF文件并将其放入显示内存。分配pixelARGB值的行似乎效率极低,此代码需要3-4秒才能重绘屏幕。 有没有办法可以避免移位和定位,只需将字节值放在32位字内的正确位置? 在其他语言中,我使用“重叠变量”或“变体记录”等来完成此操作。在Java中找不到这个。谢谢。

for (y=0; y<700; y++) { // for each line
    i = 0;
    for (x=0; x<700; x++) { // for each dot
        red = lineBuf[i++] & 0xFF;
        green = lineBuf[i++] & 0xFF;
        blue = lineBuf[i++]& 0xFF;
        pixelARGB = 0xFF000000 | (red << 16)| (green << 8) | blue;
        this_g.setPixel(x + BORDER, y + BORDER, pixelARGB);
    }
    size=is.read(lineBuf,0,2100);
}

1 个答案:

答案 0 :(得分:1)

至少有一种方法可以更有效地将您的TIFF图像数据缓冲区转换为Bitmap,并且可以进行优化。

1。使用int[]数组而不是像素副本:

您仍然需要单独计算每个像素,但要将它们设置为int[]数组。 setPixel()功能正在耗费您的所有时间。

示例:

final int w = 700;
final int h = 700;
final int n = w * h;
final int [] buf = new int[n];
for (int y = 0; y < h; y++) {
    final int yw = y * w;
    for (int x = 0; x < w; x++) {
        int i = yw + x;
        // Calculate 'pixelARGB' here.
        buf[i] = pixelARGB;
    }
}
Bitmap result = Bitmap.createBitmap(buf, w, h, Bitmap.Config.ARGB_8888);

2。在你的循环中调整大小:

这种可能性不大,但如果已知结果图片的目标ImageView小于源图像(问题中为700x700),则可以在{{1}内调整大小}循环以获得极高的性能提升。

您需要做的是遍历目标图像像素,计算源图像中所需的像素forx值,仅为这些像素计算y值,填充较小的pixelARGB数组,最后生成较小的int[]。许多。更快。

你甚至可以通过每个目标像素的四个最近源像素的自制立方插值来增强调整大小的质量,但我认为你会发现这不需要用于显示目的。