我有这个工作代码,它读取一个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);
}发布于 2013-03-27 19:45:54
至少有一种方法可以更有效地将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循环中调整大小,以获得极高的性能提升。
您需要做的是循环遍历目标图像像素,从源图像中计算需要的像素x、y值,只计算那些像素的pixelARGB值,填充较小的int[]数组,最后生成更小的Bitmap。很多。再快点。
您甚至可以通过对每个目标像素的四个最近的源像素进行自制的三次插值来提高调整大小的质量,但我认为您会发现这对于显示目的来说是不必要的。
https://stackoverflow.com/questions/15667757
复制相似问题