python - 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
解决方案
出于某种原因,这似乎不是必需的,假设因为 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
推荐阅读
- google-chrome - Chrome 网上应用店 (CWS) API 付款 TOKEN_MISSING_ERROR
- excel - Accessing a text box on a worksheet multipage object (Not a VBA userform)
- angular - angular-google-charts:解析 x 属性的意外值 NaN
- firebase - Bootstrap Vue + Nuxt JS modal problem inside v-for
- python-3.x - AttributeError: module 'pandas' has no attribute 'read_csv' in python 3.6
- excel - VBA Mismatch - Range
- c# - 删除mongdb中数组列表的一个对象
- r - non-numeric argument to mathematical function error while rounding off particular column in R dataframe
- c# - 表单内的 asp-action 不会进入控制器
- python - Mac OS X 上 pipenv 内带有 matplotlib 的空白图