首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更有效的RGB到ARGB转换

更有效的RGB到ARGB转换
EN

Stack Overflow用户
提问于 2013-03-27 19:29:32
回答 1查看 3K关注 0票数 0

我有这个工作代码,它读取一个700x700 RGB24 TIF文件,并将它放入显示内存中。分配pixelARGB值的行看起来效率极低,这段代码需要3-4秒才能重新绘制屏幕。有什么方法可以避免移位和轮询,只需将字节值放置在32位字内的正确位置?在其他语言中,我用“覆盖变量”或“变体记录”之类的方法完成了这一工作。在Java中找不到这个。谢谢。

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-27 19:45:54

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

1.使用int[]数组而不是像素副本:

您仍然需要单独计算每个像素,但是要在int[]数组中设置它们。是setPixel()函数占用了您所有的时间。

示例:

代码语言:javascript
复制
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。很多。再快点。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15667757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档