0

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

1 回答 1

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的像素值,仅计算这些像素的值,填充较小的int[]数组,最后生成较小的Bitmap. 很多。快点。

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

于 2013-03-27T19:45:54.843 回答