首页 > 解决方案 > Rasterio MemoryFile 到 Pillow 图像(或 base64 输出)

问题描述

我正在尝试编写一个 AWS Lambda 函数,该函数采用 TIFF,将其转换为 JPEG,然后以 base64 输出,以便 lambda 可以为其提供服务。但是我一直遇到格式错误的响应,或者reshape_as_image说轴与数组不匹配的问题。

我的理解是返回memfile.read()将允许我使用 reshape_as_image,但是我的逻辑似乎有问题。

如果不保存到磁盘,如何从 memfile 获取 base64 jpeg 表示,以便 lambda 可以提供它?我也试过枕头,但我认为必要的步骤是我失败的地方。

    def get_image(self, driver="jpeg"):
        data = self.get_image()

        with MemoryFile() as memfile:
            # Change the driver for output
            data[1]['driver'] = driver
        with MemoryFile() as memfile:
            # Change the driver for output
            data[1]['driver'] = driver

            with memfile.open(**data[1]) as dataset:
                dataset.write(data[0])
                
            image = memfile.read()
            image = reshape_as_image(image)
            im = Image.open(io.BytesIO(image))
            b64data = base64.b64encode(im.tobytes()).decode('utf-8')
            return b64data

标签: pythonpython-3.xpython-imaging-librarygdalrasterio

解决方案


出于某种原因,这似乎不是必需的,假设因为 memfile.read() 给出了图像的实际字节。

    def get_image(self, store=False, driver="GTiff"):
        data = self.crop_ortho(store)

        with MemoryFile() as memfile:
            # Change the driver for output
            data[1]['driver'] = driver

            with memfile.open(**data[1]) as dataset:
                dataset.write(data[0])

            image = memfile.read()
            im = Image.open(io.BytesIO(image))
            im = im.convert('RGB')
            # Save bytes to a byte array
            imgByteArr = io.BytesIO()
            im.save(imgByteArr, format='jpeg')

            b64data = base64.b64encode(imgByteArr.getvalue())
            
            return b64data

推荐阅读