使用Python将BLOB图像转换为PNG、JPG

3

我有几个 Oracle 中的 blob 图像,所以我用 Python 读取它们。

使用我的代码,我可以正确地从某个表格 table1 中读取和转换图像,但是当我切换到 table2 时,我无法执行相同的代码,因为我得到以下错误:

无法识别图像文件 <_io.BytesIO object at 0x000000000C4520A0>

这是我的代码:

import pandas as pd
import cx_Oracle
from PIL import Image
#[connection to database with connecting string `conn`]
#[query to acces 1 single image]
result = pd.read_sql(query, conn) #connection to db
img = result["IMAGE"][0].read()  # reading the first BLOB result 
pre_img = io.BytesIO(img)
Image.open(pre_img)

这段代码运行良好,唯一的问题是我尝试从table1中读取图片时出现了问题。在SQL开发人员中,我可以预览table1中的照片,但不能预览table2。 数据类型是Oracle中的BLOB,如describe(table)所述。

img的值可以在此处找到。

sql can't read the image neither


1
“img的值”是一个经过base64编码的1位Tiff签名图像。因此,数据本身是有效的图像,似乎不是罪魁祸首。 - ypnos
1
你能在你的代码示例中展示任何导入语句吗?知道你正在使用哪个库对于“Image”非常有用。Image正在寻找文件路径而不是原始数据,也许同一库具有原始图像读取功能。 - scotty3785
1
例如,PIL/Pillow 函数 Image.from_bytes 可能会很有帮助。 - scotty3785
@ypnos 你用Python看图片了吗? - L F
2个回答

2
安装Pillow模块。
py -m pip install Pillow

使用该模块从 Blob 中展示或保存文件。
from PIL import Image 

file = request.files['file']
img = Image.open(file.stream)
img.show()
img.save("imagefile.jpg")

2
这段代码对我起作用了。
import base64
with open("imageToSave.png", "wb") as fh:
    fh.write(base64.decodebytes(img))

你怎么知道这张图片是 .png 格式的? - Mark Ransom
该图像不是 .png 格式。我正在创建一个名为 imageToSave.png 的空文件,然后使用该空文件来存储我从数据库中读取的 BLOB 图像。 - L F
我用with open("imageToSave.jpg", "wb") as fh:很好地工作了。 - L F
这取决于你所说的“正常工作”的含义。是的,它会保存文件,但你能打开文件并获取图像吗?如果它是 .png 格式,那么如果你将其保存为 .jpg 格式,它将失败;如果它是 .jpg 格式,那么如果你将其保存为 .png 格式,它也将失败。 - Mark Ransom
1
是的,“工作正常”指生成的图像可以被我的查看器读取。感谢您的评论,我现在意识到不应将任何blob输入转换为png图像。有没有办法知道文件的原始扩展名? - L F
如果有一种自动知道的方法,Image.open 应该能够找出来。你需要更多地了解这些 blob 是如何写入数据库的。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接