最终对我来说最合适的解决方案是使用ImageData每个AbstractImage子类附带的类。
所述ImageData类表示图像作为一个字节数组,或者更精确地,其中的每个字符表示所期望的颜色空间中的坐标的字符串。
要获得给定的字节表示image,您可以调用
image_data = image.get_image_data()
width = image_data.width
data = image_data.get_data('RGB', 3*width)
Run Code Online (Sandbox Code Playgroud)
我们在get_data这里传递的第二个参数是我们期望为图像的每一行获得的字节数。因为我们希望每个像素都有 R、G 和 B 的所有分量,所以我们希望图像宽度是其 3 倍。如果我们只对每个像素的强度感兴趣,我们将传递参数('I', image.width)。这是一些官方文档。
要仅获取您感兴趣的像素的值,例如(x,y),您可能想要这样做:
pos = (width*y + x) * 3
rgb = map(ord, data[pos:pos+3])
Run Code Online (Sandbox Code Playgroud)
除了检索ImageData整个图像的 并在之后选择所需的像素值之外,您还可以调用get_image_data()某个区域,即所需位置的 1x1 像素:
image_data = image.get_region(x,y,1,1).get_image_data()
Run Code Online (Sandbox Code Playgroud)
这就是谷歌群组帖子的完成方式,您还可以在其中找到有用的信息,即获取图像数据似乎更有效,RGBA而不是RGB.
现在,为了最终回答问题,还有一个用于 ImageData, 的图像字节数据的 setter 方法set_data,它的工作方式正好相反。
image_data.set_data('RGB', image.width*3, data)
Run Code Online (Sandbox Code Playgroud)
这可能也适用于区域,但我还没有尝试过。如果要设置存储在整数数组中的字节数据,请传递''.join(map(chr, data)). 不知道有没有办法设置数值。
希望这可以帮助任何在这个相当古老的问题上绊倒的人,这恰好是某些搜索词的突出谷歌结果。
| 归档时间: |
|
| 查看次数: |
2940 次 |
| 最近记录: |