pygame で画像を使用および操作するための次のクラスがあります。
class Image:
def __init__(self,file_path=None, width=0, height=0):
try:
self.image = pygame.image.load(file_path)
except:
raise IOError
self.width = self.image.get_size()[0]
self.height = self.image.get_size()[1]
def copy(self):
return Image(0, 0, self.file_path)
def __getitem__(self, key):
x, y = key
internal_pxarray = pygame.PixelArray(self.image)
rgb_int = internal_pxarray[x][y]
rgb = self.image.unmap_rgb(rgb_int)
if len(rgb) == 4:
return rgb[:-1]
elif len(rgb) == 3:
return rgb
else:
return None
def __setitem__(self, key, value):
internal_pxarray = pygame.PixelArray(self.image)
x, y = key
internal_pxarray[x][y] = pygame.Color(value[0], value[1], value[2])
self.image = internal_pxarray.make_surface()
私はこのように使用します:
image = Image('test.bmp')
window.displayImage(image)
for x in range(0, image.width):
for y in range(0, image.height):
...
image[x, y] = 250, 218, 221
Imageクラスを含むモジュールでcythonを使用してこれを高速化しようとしましたが、コードを実行すると、この行internal_pxarray[x][y] = pygame.Color(value[0], value[1], value[2])
が次のエラーを引き起こすようです:
Traceback (most recent call last):
File "../pink.py", line 13, in <module>
image[x, y] = 250, 218, 221
File "imgproc.py", line 51, in imgproc.Image.__setitem__ (imgproc.c:2256)
self.image = internal_pxarray.make_surface()
SystemError: /Users/sysadmin/build/v2.7.3/Objects/methodobject.c:120: bad argument to internal function
理由がわかりません。pudb でステップスルーしようとしましたが、すべて問題ないようです。
コンパイルされた *.c ファイルの対応する行は次のとおりです。__pyx_t_6 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
methodobject.cPyErr_BadInternalCall();
を見ると、このエラーはデフォルトとして発生しているようです (PyObject_Call
メソッドの引数が有効でない場合に発生します。しかし、私の C の知識はあまりにも限られているため、ここで何が起こっているのかを正確に理解することはできません。
何か案は?
ありがとう、
ジェイク