我正在使用二进制 PBM 格式。当我阅读它时,我有一个整数数组,其中整数是字节的序数。数组中的每个整数都被转换为二进制表示的 0 和 1 整数列表,然后我反转这个列表。像素网格从 0:0 开始,所以第一个像素的位置是 [0:0]。
如果 x >= 8,我需要获取像素颜色。如果 x < 8,一切正常。获取像素颜色的代码。
def getpixel(self, x, y):
'''PNMReader.getpixel(x, y) -> int
Get pixel at coordinates [x:y] and return it as integer.'''
if not isinstance(x, int) or not isinstance(y, int):
raise(TypeError('both x and y must be integers'))
if x < -1 or y < -1:
raise(ValueError('both x and y are interpreted as in slice notation'))
if x > (self.width-1):
raise(ValueError('x cannot be equal or greater than width'))
if y > (self.height-1):
raise(ValueError('x cannot be equal or greater than height'))
width, height = self.width, self.height
x = (x, width-1)[x == -1]
y = [y, height-1][y == -1]
p = (y *height) +x
width, height = self.width, self.height
pixels = self._array_
q = (8, width)[width -8 < 0]
if x >= q:
while x % q:
y += 1
x -= 1
from pprint import pprint
color = bitarray(pixels[y])[::-1][:q][x]
print(color)
bitarray
你可以在这里看到我定义的函数,用于获取整数位作为列表;self._array_
是一个整数序列(它们只是从 PBM 读取的字节的序数)。
如果 x >= 8,我需要修复此函数以获取像素颜色。在这种情况下,我无法理解如何计算 x 和 y 的偏移量。
只接受快速工作的答案。我不想将所有位加入一维数组,因为如果图像很大(例如它可以是 3000x5000 像素),它可能会太慢。
我知道我可以使用一些模块,如imagemagick
orfreeimage
等,但我只能使用标准库(没有额外的模块)。我需要没有绑定或非默认模块的纯 Python 解决方案。