【问题标题】:More Efficient RGB to ARGB Conversion更高效的 RGB 到 ARGB 转换
【发布时间】:2013-03-27 19:29:32
【问题描述】:

我有这个工作代码,它读入一个 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);
}

【问题讨论】:

  • 你试过了吗? int ARGB = new Color(red, green, blue, alpha).getRGB();
  • lineBuf 是什么类型的数组,如果是 int 数组,则浪费了大量内存/时间,如果不是,则浪费了所有 &amp; 0xFF 掩码。跨度>
  • Serdalis: LineBuf 是一个字节数组,你是对的 & 0xFF 显得浪费了。我会删除它并重新测试。谢谢。 Pragnini:谢谢,我会试试的。
  • Serdalis:如果我移除遮罩,那么显示的最终像素会损坏;显然发生了符号扩展,当设置最高位时,所有位都变为“1”,导致白色显示。
  • Pragnani:我能够将旋转和移位替换为:pixelARGB=Color.argb(alpha,red,green,blue);这与您的建议相似;但是,性能保持不变。正如大卫(下文)所建议的那样,由于有大量的 setPixel 调用,它一定很慢。感谢您的帮助。

标签: java android graphics rgb argb


【解决方案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),那么您可以在 for 循环中调整大小极高的性能提升。

您需要做的是遍历目标图像像素,从源图像中计算您需要的像素xy 值,仅计算这些像素的pixelARGB 值,填充较小的@987654331 @array,最后生成一个更小的Bitmap。很多。更快。

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

【讨论】:

  • David,这个 700x700 的图像正在绘制到现有 800x800 位图的中间;所以我必须看看我是否可以将 700x700 区域插入中间——我相信你 setPixel 大部分时间都在燃烧。我找不到 set Row 函数,否则我会使用它。关于#2,该文件与绘制的地图具有相同的分辨率,因此无需缩小尺寸。谢谢
  • 不客气。我没想到 #2 能够提供帮助,但必须尝试一下,因为改进可能非常大。关于源 700x700 与目标 800x800,我建议您允许 Android 在显示时通过标准 Layout 参数对其进行缩放。这是非常有效的。请注意,尺寸并不总是完全按照您的预期显示,因为 Android 操作系统会根据屏幕密度进一步缩放图像,以便所有图像在所有设备上都显示为相同的物理尺寸 - 这通常会让开发人员感到困惑。
  • 听从 David 的建议,我已将系统调用最小化为两个,一个用于读取 TIFF 的 rgb 元素,另一个用于将位图输出到预先存在的画布上。希望编译器智能地处理那些
猜你喜欢
  • 1970-01-01
  • 2011-07-27
  • 2017-06-29
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多