保存位图的RGB

时间:2015-12-12 19:30:02

标签: android bitmap type-conversion

我目前正在从位图中提取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

2 个答案:

答案 0 :(得分:1)

您从整数中提取四个通道,这意味着每个通道都是8位,假设它是一个32位整数。所以你可以很好地使用字节。

除非您将整个像素保存为整数,否则您不会从使用整数或短路中获得任何好处。如果你使用短路则会失去精确度。

答案 1 :(得分:1)

  

有什么理由不使用我在这里缺少的短片吗?

在大多数情况下int,每个int四个频道更好。

  

不值得将价值投入到做空吗?

这不值得。

<强> TL; NR

这很大程度上取决于你对这些值的处理方式:

  1. 如果你将它们藏在short[]中,假设你每个频道使用一个int[]颜色值,这将比在int中存储它们更有效。另外,请考虑一下JeppeSRC所说的内容:您可以只使用byte[],当您使用该值时,您可以使用零扩展名转换回int,如下所示:

    int channelColorValue = (int) myBytes[i] & 0xff;

    这样可以防止使用错误的负值。

  2. 如果只使用几个局部变量,它甚至不重要,但请记住,在字节码级别,Java仅对32或64个整数执行操作,请参阅this。在这种情况下,使用short代替int没有内存增益,两者都需要32位。

  3. 最节省内存的解决方案实际上是将所有值保持在int[],每个int 4个通道(alpha,red,green,blue)。您可以解压缩int并使用位操作选择单个通道颜色值,这正是您使用的方法。示例:int alpha = color >>> 24;