代码之家  ›  专栏  ›  技术社区  ›  user1644002

更高效的RGB到ARGB转换

  •  0
  • user1644002  · 技术社区  · 12 年前

    我有这个工作代码,它读取一个700x700 RGB24 TIF文件,并将其放入显示内存中。指定 pixelARGB 值似乎效率极低,此代码需要3-4秒才能重新绘制屏幕。 有没有一种方法可以避免移位和oring,只将字节值放在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 回复  |  直到 12 年前
        1
  •  1
  •   David Manpearl    12 年前

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

    1.使用 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,因此您可以在 for 循环以获得极高的性能提升。

    你要做的是循环浏览你的目标图像像素,计算像素 x , y 从源图像中计算所需的值 pixelARGB 值,填充较小的 整数[] 数组,最后生成一个较小的 位图 很更快。

    您甚至可以通过自制的三次插值来提高调整大小的质量,为每个目标像素提供四个最近的源像素,但我认为出于显示目的,您会发现这是不必要的。