首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedImage getRGB vs Raster getSample

BufferedImage getRGB vs Raster getSample
EN

Stack Overflow用户
提问于 2014-02-17 06:05:56
回答 1查看 8.6K关注 0票数 5

我试着用Java做一些图像处理。我使用ImageIO库来读取和写入图像。我可以通过以下两种方式读取图像像素值(可能还有其他不知道的方法)。

  1. 使用BufferedImage的getRGB方法:像素= image.getRGB(x,y);
  2. 使用Raster的getSample方法: WritableRaster光栅= image.getRaster(); 像素= raster.getSample(x,y,0);

这两种方法有什么不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-17 09:20:45

1:第一种方法总是以int ARGB格式并在sRGB颜色空间返回像素。不管图像的内部表示形式如何。这意味着除非图像的内部表示是TYPE_INT_ARGB,否则必须进行一些转换。这有时是有用的,因为它是可预测的,但通常它是相当缓慢的。例如,颜色空间转换是相当昂贵的。此外,如果图像的精度高于每样本8位和/或每像素4个样本,则会发生精度损失。考虑到您的用例,这可能是可接受的,也可能是不可接受的。

2:第二种方法可能给出一个像素值,但不是在所有情况下,因为它给出了带0(第一个带)的样本值(x,y)。对于TYPE_INT_ARGB,这将与像素值相同。对于TYPE_BYTE_INDEXED,这将是在查找表中使用的索引(您需要查找它以获得像素值)。对于TYPE_3BYTE_BGR,这只会给出蓝色的值(您需要将它与带1和2中的样本组合起来才能得到完整的像素值)。等。其他类型的。对于内部不表示为int的样本,将发生数据类型转换(在罕见的情况下,精度会下降)。它可能对您有用,但是我从来没有对getSample(...)方法有过太多的使用。

相反,我建议你研究一下我认为是获取像素数据最快的方法。即使用getDataElements方法:

代码语言:javascript
复制
Object pixel = null; // pixel initialized on first invocation of getDataElements

for (y) {
    for (x) {
       pixel = raster.getDataElements(x, y, pixel);
    }
}

这将为您提供数据缓冲区中的“本机”值,而不进行任何转换。

然后,您需要对要支持的每个传输类型(请参阅DataBuffer类)进行特殊处理,对于非标准类型,可能需要有一个常见的回退。

这将与像素值与标准化RGB值的方法2有相同的“问题”,因此您可能需要“手动”转换/查找。

什么方法更好,就像往常一样,取决于。您必须查看每个用例,并决定哪个更重要。轻松/简单,或最好的性能(或可能最好的质量?)

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

https://stackoverflow.com/questions/21821915

复制
相关文章

相似问题

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