有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java更高效的RGB到ARGB转换

我有这个工作代码,它读取一个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) 个答案

  1. # 1 楼答案

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

    一,。使用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);
    

    二,。在循环中调整大小:

    这不太可能,但如果已知结果图像的目的地ImageView小于源图像(在您的问题中为700x700),则可以在for循环中调整大小,以获得极高的性能提升

    你需要做的是循环遍历目标图像像素,计算源图像中需要的像素xy值,只计算这些像素的pixelARGB值,填充一个较小的int[]数组,最后生成一个较小的Bitmap。很更快

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