繁体   English   中英

更加高效的RGB到ARGB转换

[英]More Efficient RGB to ARGB Conversion

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

至少有一种方法可以更有效地将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值,填充较小的int[]数组,最后生成较小的Bitmap 许多。 快点。

您甚至可以通过对每个目标像素使用四个最接近的源像素的自酿三次插值来提高调整大小的质量,但是我认为您将不需要此显示效果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM