我试着用Java做一些图像处理。我使用ImageIO库来读取和写入图像。我可以通过以下两种方式读取图像像素值(可能还有其他不知道的方法)。
这两种方法有什么不同?
发布于 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方法:
Object pixel = null; // pixel initialized on first invocation of getDataElements
for (y) {
for (x) {
pixel = raster.getDataElements(x, y, pixel);
}
}这将为您提供数据缓冲区中的“本机”值,而不进行任何转换。
然后,您需要对要支持的每个传输类型(请参阅DataBuffer类)进行特殊处理,对于非标准类型,可能需要有一个常见的回退。
这将与像素值与标准化RGB值的方法2有相同的“问题”,因此您可能需要“手动”转换/查找。
什么方法更好,就像往常一样,取决于。您必须查看每个用例,并决定哪个更重要。轻松/简单,或最好的性能(或可能最好的质量?)
https://stackoverflow.com/questions/21821915
复制相似问题