def check_original_dimensions(img): assert img.size == Size(100, 100) assert img[0].size == Size(32, 32) assert img[0].canvas.position == Vector(5, 10) assert img[1].size == Size(32, 32) assert img[1].canvas.position == Vector(35, 30) assert img[2].size == Size(32, 32) assert img[2].canvas.position == Vector(62, 50) assert img[3].size == Size(32, 32) assert img[3].canvas.position == Vector(10, 55)
def test_pixel_iter(): """Does iterating over pixels appear to work?""" img = Image.read(util.find_image('terminal.gif')) pixel_iter = iter(img[0].pixels) white = RGBColor(1., 1., 1.) px = next(pixel_iter) assert px.point == Vector(0, 0) assert px.color == white px = next(pixel_iter) assert px.point == Vector(1, 0) assert px.color == white
def test_multi_frame_resize(): """ImageMagick doesn't handle resizing correctly when a virtual canvas is involved. Make sure we fixed it. """ img = get_image('anim_bgnd.gif') # Original dimensions assert img.size == Size(100, 100) assert img[0].size == Size(32, 32) assert img[0].canvas.position == Vector(5, 10) assert img[1].size == Size(32, 32) assert img[1].canvas.position == Vector(35, 30) assert img[2].size == Size(32, 32) assert img[2].canvas.position == Vector(62, 50) assert img[3].size == Size(32, 32) assert img[3].canvas.position == Vector(10, 55) img = img.resized(img.size * 0.5) # Resized dimensions -- reduced by half assert img.size == Size(50, 50) assert img[0].size == Size(16, 16) assert img[0].canvas.position == Vector(3, 5) assert img[1].size == Size(16, 16) assert img[1].canvas.position == Vector(18, 15) assert img[2].size == Size(16, 16) assert img[2].canvas.position == Vector(31, 25) assert img[3].size == Size(16, 16) assert img[3].canvas.position == Vector(5, 28)
def __setitem__(self, point, color): """Set a single pixel to a given color. This is "slow", in the sense that you probably don't want to do this to edit every pixel in an entire image. """ point = Vector.coerce(point) rgb = color.rgb() # TODO retval is t/f with magick_try() as exc: # Surprise! GetOneCacheViewAuthenticPixel doesn't actually respect # writes, even though the docs explicitly says it does. # So get a view of this single pixel instead. px = lib.GetCacheViewAuthenticPixels(self._ptr, point.x, point.y, 1, 1, exc.ptr) exc.check(px == ffi.NULL) array = ffi.new("double[]", [rgb._red, rgb._green, rgb._blue, rgb._opacity]) lib.sanpera_pixel_from_doubles(px, array) #print(repr(ffi.buffer(ffi.cast("char*", ffi.cast("void*", px)), 16)[:])) with magick_try() as exc: assert lib.SyncCacheViewAuthenticPixels(self._ptr, exc.ptr)
def __getitem__(self, point): point = Vector.coerce(point) px = ffi.new("PixelPacket *") # TODO retval is t/f with magick_try() as exc: lib.GetOneCacheViewAuthenticPixel(self._ptr, point.x, point.y, px, exc.ptr) array = ffi.new("double[]", 4) lib.sanpera_pixel_to_doubles(px, array) return RGBColor(*array)
def __setitem__(self, point, color): """Set a single pixel to a given color. This is "slow", in the sense that you probably don't want to do this to edit every pixel in an entire image. """ point = Vector.coerce(point) rgb = color.rgb() # TODO retval is t/f with magick_try() as exc: # Surprise! GetOneCacheViewAuthenticPixel doesn't actually respect # writes, even though the docs explicitly says it does. # So get a view of this single pixel instead. px = lib.GetCacheViewAuthenticPixels( self._ptr, point.x, point.y, 1, 1, exc.ptr) exc.check(px == ffi.NULL) array = ffi.new("double[]", [rgb._red, rgb._green, rgb._blue, rgb._opacity]) lib.sanpera_pixel_from_doubles(px, array) #print(repr(ffi.buffer(ffi.cast("char*", ffi.cast("void*", px)), 16)[:])) with magick_try() as exc: assert lib.SyncCacheViewAuthenticPixels(self._ptr, exc.ptr)
def point(self): return Vector(self._x, self._y)