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
method:
Object pixel = null; // pixel initialized on first invocation of getDataElements
for (y) {
for (x) {
pixel = raster.getDataElements(x, y, pixel);
}
}
这将为您提供数据缓冲区中的“本机”值,无需任何转换。
然后,您需要对每种传输类型进行特殊处理(请参阅DataBuffer
class)你想要支持,也许是非标准类型的常见后备。
对于像素值与标准化 RGB 值,这将具有与方法 2 相同的“问题”,因此您可能需要“手动”转换/查找。
一如既往,哪种方法更好取决于具体情况。您必须查看每个用例,并决定什么更重要。轻松/简单,或者最好的性能(或者也许最好的质量?)。