def decode(image): """Recognize image and return generator with all the available QR codes Currently supports only PIL Image object as an parameter """ # TODO: `image` type check # Convert to grayscale mode if image.mode not in ('1', 'L'): image = image.convert('L') width, height = image.size pixels = image.load() obj = api.new() api.resize(obj, width, height) buffer = api.begin(obj, width, height) # Fill buffer with a image pixels. One cell, one pixel. for idx, pixel in enumerate(converters.pil(image)): buffer[idx] = pixel # Finish codes identification api.end(obj) code = api.structures.Code() data = api.structures.Data() for i in range(api.count(obj)): # Extract first code api.extract(obj, i, code) api.decode(code, data) yield Code( tuple([(corner.x, corner.y) for corner in code.corners]), code.size, data.version, data.ecc_level, data.data_type, ctypes.string_at(data.payload, data.payload_len), ) api.destroy(obj)
def __del__(self): api.destroy(self._obj)