Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更高效的RGB到ARGB转换_Java_Android_Graphics_Rgb_Argb - Fatal编程技术网

Java 更高效的RGB到ARGB转换

Java 更高效的RGB到ARGB转换,java,android,graphics,rgb,argb,Java,Android,Graphics,Rgb,Argb,我有这个工作代码,它读取700x700 RGB24 TIF文件并将其放入显示内存。分配像素argb值的行似乎效率极低,此代码需要3-4秒来重新绘制屏幕。有没有一种方法可以避免移位和oring,只需将字节值放在32位字中的正确位置? 在其他语言中,我用“叠加变量”或“变量记录”之类的语言来实现这一点。在Java中找不到这个。多谢各位 for (y=0; y<700; y++) { // for each line i = 0; for (x=0; x<700; x++)

我有这个工作代码,它读取700x700 RGB24 TIF文件并将其放入显示内存。分配
像素argb
值的行似乎效率极低,此代码需要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);
}

对于(y=0;y至少有一种方法可以更有效地将TIFF图像数据缓冲区转换为
位图,并且可以进行优化

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);
final int w=700;
最终int h=700;
最终整数n=w*h;
最终整数[]buf=新整数[n];
对于(int y=0;y
2.在循环中调整大小: 这不太可能,但如果已知结果图像的目标
ImageView
小于源图像(在您的问题中为700x700),则可以在
for
循环中调整大小,以获得极高的性能提升

您需要做的是循环遍历目标图像像素,计算源图像所需的像素
x
y
值,计算仅这些像素的
pixelARGB
值,填充更小的
int[]
数组,最后生成更小的
位图
。速度更快


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

您尝试过这个吗?int ARGB=新颜色(红、绿、蓝、阿尔法)。getRGB();什么类型的数组是
lineBuf
,如果它是
int
数组,那么会浪费大量的内存/时间,如果不是,那么所有的
&0xFF
掩码都会被浪费。Serdalis:lineBuf是字节数组,你是对的,&0xFF看起来被浪费了。我会删除它并重新测试。谢谢。Pragnini:谢谢我会尝试的。Serdalis:if remove遮罩,则显示的最终像素已损坏;显然存在符号扩展,当顶部位设置为“1”时,所有位都变为白色显示。Pragnani:I能够用:pixelARGB=Color.argb(alpha、红色、绿色、蓝色)替换旋转和移位;这与您的建议类似;但是,性能保持不变。由于David(如下)多次调用setPixel,因此速度一定很慢建议。感谢您的帮助。David,这张700x700图像正在绘制到现有800x800位图的中间;因此我必须看看是否可以将700x700区域插入中间——我相信setPixel会占用大量时间。我找不到设置行函数,或者我会使用它。关于#2,该文件分辨率与绘制的地图相同,因此不会缩小尺寸。谢谢你。我没想到#2会有帮助,但你必须尝试,因为改进可以非常好。关于源700x700与目标800x800,我建议你允许Android在显示时通过标准
布局
p进行缩放参数。这是非常有效的。请注意,大小不会总是完全按照您的预期显示,因为Android操作系统会根据屏幕密度进一步缩放图像,以便所有设备上的所有图像都显示相同的物理大小-这通常会让开发人员感到困惑。按照David的建议,我已经最小化了系统调用一个是读取TIFF的rgb元素,另一个是将位图输出到预先存在的画布上