如何将PIL图像转换为Base64格式而不保存?

7
回复内容存在敏感词^**$格式,但不需要将它保存到任何文件夹中...

我有一些数据,使用以下代码可以获取RGB图像:

img = Image.fromarray(data,'RGB')

如何将PIL转换为base64?(我不能打开图像文件,因为我不必保存图像)?

感谢您的帮助。

使用Node JS,我可以通过以下几行代码获取正确的base64:

pythonShell= require("python-shell");

app.post('/index/gen/',urlencodedParser, function (req,res){ 
  pythonShell.run('minigen.py', function (err, results) {
  if (err) throw err; 
  var img = base64img.base64Sync('./images/miniature.jpg');
  res.send(img); }); 
}) 

但是如果我使用NodeJS,我必须保存文件...
这是从图像生成矩阵的代码,您不需要知道数据中包含什么;)
image = Image.open("./carte/"+fichier)              
image = image.resize((400,400),Image.ANTIALIAS)     
w,h = image.size                                    
tab = numpy.array(image)                            
data = numpy.zeros((h, w, 3), dtype=numpy.uint8)

你确定要转换PIL吗?我认为将data数组转换更有意义。 - James Kent
我必须将数据转换为RGB图像,然后将该图像对象转换为base64。 - florian
可能是重复的问题:是否可以从图像对象创建encodeb64? - bv.
4个回答

13

我找到了解决办法。希望这可以帮到你!

img = Image.fromarray(data, 'RGB')                  #Crée une image à partir de la matrice
buffer = BytesIO()
img.save(buffer,format="JPEG")                  #Enregistre l'image dans le buffer
myimage = buffer.getvalue()                     
print "data:image/jpeg;base64,"+base64.b64encode(myimage)

11

@florian的回答帮了我很多,但是base64.b64encode(img_byte)返回的是字节,所以我需要在连接之前将其解码为字符串(使用Python 3.6):

def img_to_base64_str(self, img):
    buffered = BytesIO()
    img.save(buffered, format="PNG")
    buffered.seek(0)
    img_byte = buffered.getvalue()
    img_str = "data:image/png;base64," + base64.b64encode(img_byte).decode()

8
你可以像这样使用 base64 库:
import base64

base64.b64encode(img.tobytes())

请参阅Image对象的tobytes()方法。

转换为RGB图像后,我这样做并没有得到正确的值。 - florian
@florian 你所说的“正确值”是什么意思?Base64只是将二进制数据编码为ASCII字符,这正是你要求的。 - Tomáš Linhart
1
img = Image.fromarray(data,'RGB') 中的 data 是从哪里来的,它们代表什么?在我所提供的答案中,有关于像JPEG这样的压缩格式的警告,它与 Image.tobytes() 方法的文档有关。 - Tomáš Linhart
这是来自图像的矩阵。 - florian
1
你能分享一下填充data对象的代码部分吗? - Tomáš Linhart
显示剩余3条评论

2
您可以使用类似以下的方法:

最初的回答:

import glob
import random
import base64

from PIL import Image
from io import BytesIO
import io


def get_thumbnail(path):
    path = "\\\\?\\"+path # This "\\\\?\\" is used to prevent problems with long Windows paths
    i = Image.open(path)    
    return i

def image_base64(im):
    if isinstance(im, str):
        im = get_thumbnail(im)
    with BytesIO() as buffer:
        im.save(buffer, 'jpeg')
        return base64.b64encode(buffer.getvalue()).decode()

def image_formatter(im):
    return f'<img src="data:image/jpeg;base64,{image_base64(im)}">'

只需在get_thumbnail函数中传递图像路径,并使用image_formatter将其显示在HTML中。


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