1

我在访问从存储为 bytea 的数据库中处理的图像时遇到问题,这是我调整图像大小的方法。

CREATE OR REPLACE FUNCTION public.ajustar(randstring bytea)
 RETURNS bytea
 LANGUAGE plpythonu
AS $function$
    from io import BytesIO
    import PIL
    from PIL import Image
    basewidth = 300
    mem_file = BytesIO()
    mem_file.write(randstring)
    img = Image.open(mem_file)
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
    img.close()
    return img
$function$;

所以我的问题是返回一个字节但得到一个地址,我怎样才能得到图像而不是地址?它工作的唯一方法是将img保存到一个文件中img.save('/home/postgres/imagen.jpg'),而不是我需要放入一个对象来替换数据库中的图像。

pruebas=# select encode(ajustar(foto), 'escape') from personal where id=193;
                           encode                           
------------------------------------------------------------
 <PIL.Image.Image image mode=RGB size=300x347 at 0x1895990>
(1 fila)

提前致谢

4

1 回答 1

1

使用此功能,您可以处理数据库中的图像(jpeg 格式)。这是使用 plpython 制作的,如果您使用的是 Linux,请使用以下命令更新 Centos 7 上的枕头库

$sudo pip install Pillow

或者

$sudo pip update Pillow

这就是功能。

CREATE FUNCTION ajustar(randstring bytea) RETURNS bytea
    LANGUAGE plpythonu
    AS $$
    from io import BytesIO
    import PIL
    from PIL import Image
    basewidth = 300
    mem_file = BytesIO()
    mem_file.write(randstring)
    img = Image.open(mem_file)
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
    salida = BytesIO()
    img.save(salida, format='JPEG')
    hex_data = salida.getvalue()
    img.close()
    return hex_data
$$;
于 2017-04-05T04:35:01.643 回答