我目前正在从位图中提取RGB值。在互联网上,样本看起来非常相似:
int colour = bitmap.getPixel(x, y);
int red = Color.red(colour);
int blue = Color.blue(colour);
int green = Color.green(colour);
int alpha = Color.alpha(colour);
但有一件事我不理解:每个人都在使用int
来保存这些值。我正在考虑使用short
来节省内存。我有什么理由不使用我在这里失踪的short
吗?是否值得将值转换为short
?
答案 0 :(得分:1)
您从整数中提取四个通道,这意味着每个通道都是8位,假设它是一个32位整数。所以你可以很好地使用字节。
除非您将整个像素保存为整数,否则您不会从使用整数或短路中获得任何好处。如果你使用短路则会失去精确度。
答案 1 :(得分:1)
有什么理由不使用我在这里缺少的短片吗?
在大多数情况下int
,每个int
四个频道更好。
不值得将价值投入到做空吗?
这不值得。
<强> TL; NR 强>
这很大程度上取决于你对这些值的处理方式:
如果你将它们藏在short[]
中,假设你每个频道使用一个int[]
颜色值,这将比在int
中存储它们更有效。另外,请考虑一下JeppeSRC所说的内容:您可以只使用byte[]
,当您使用该值时,您可以使用零扩展名转换回int
,如下所示:
int channelColorValue = (int) myBytes[i] & 0xff;
这样可以防止使用错误的负值。
如果只使用几个局部变量,它甚至不重要,但请记住,在字节码级别,Java仅对32或64个整数执行操作,请参阅this。在这种情况下,使用short
代替int
没有内存增益,两者都需要32位。
最节省内存的解决方案实际上是将所有值保持在int[]
,每个int 4个通道(alpha,red,green,blue)。您可以解压缩int
并使用位操作选择单个通道颜色值,这正是您使用的方法。示例:int alpha = color >>> 24;