Re: OT? plpython2u - Mailing list psycopg
From | Adrian Klaver |
---|---|
Subject | Re: OT? plpython2u |
Date | |
Msg-id | 48462c27-69d0-14b2-a4e6-b9d2e81828b5@aklaver.com Whole thread Raw |
In response to | Re: OT? plpython2u (Nahum Castro <nahumcastro@gmail.com>) |
Responses |
Re: OT? plpython2u
|
List | psycopg |
On 10/20/2016 12:03 PM, Nahum Castro wrote: > > > 2016-10-20 13:06 GMT-05:00 Jonathan Rogers <jrogers@socialserve.com > <mailto:jrogers@socialserve.com>>: > > On 10/20/2016 01:14 PM, Nahum Castro wrote: > > Hello all. > > > > I need to process images on my database, they are stored on a bytea column. > > > > The process consist on scaling and I have done this so far: > > > > CREATE OR REPLACE FUNCTION ajustar(randstring bytea) > > RETURNS bytea AS > > $$ > > import PIL > > from PIL import Image > > basewidth = 300 > > img = randstring > > wpercent = (basewidth/float(img.size[0])) > > hsize = int((float(img.size[1])*float(wpercent))) > > img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS) > > > > return img > > $$ > > LANGUAGE 'plpython2u' VOLATILE; > > As you probably know, Postgres procedural languages are server-side > extensions and therefore have nothing to do with psycopg, which is a > client-side library. > > Thanks, but rather than help in plpython is how to pass the variable > bytea from postgres to an image in python. > > > > > > The objective of this pl is read the bytea from the database, scale, > > then replace the scaled image in the database, but I don't know what > > type use to pass to the variable img. > > AFAICT, if you pass a bytea value to a plpythonu function, it will > receive a Python str object. > > > That is where i get confused, what is stored in the db is in bytea, how > I do to transform in a str? It is done for you: https://www.postgresql.org/docs/9.5/static/plpython-data.html#AEN65498 "PostgreSQL bytea is converted to Python str in Python 2 and to bytes in Python 3. In Python 2, the string should be treated as a byte sequence without any character encoding. When the PostgreSQL return type is bytea, the return value will be converted to a string (Python 2) or bytes (Python 3) using the respective Python built-ins, with the result being converted to bytea." So something like this: 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) return img $function$ postgres@test=# select ajustar(barcode) from pict_test where full_upc = '744835000544'; ajustar ---------------------------------------------------------------------------------------------------------------------------------- \x3c50494c2e496d6167652e496d61676520696d616765206d6f64653d5247422073697a653d333030783230392061742030783746393343314532333635303e (1 row) barcode are small png's in this case. > > > > > > > > This is the query. > > update personal set foto=ajustar(encode(foto, 'hex')::bytea); > > Why are you encoding the binary data into a textual representation? What > image format is stored in column "foto"? Depending on the format, you > probably want to use one of these constructors in function "ajustar": > > > Sorry I forgot, all images are in jpeg format. > > > > http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring > <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring> > > http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open > <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open> > > > Again thanks. > Nahum > > > > -- > Jonathan Rogers > Socialserve.com by Emphasys Software > jrogers@emphasys-software.com <mailto:jrogers@emphasys-software.com> > > -- > Jonathan Rogers > Socialserve.com by Emphasys Software > jrogers@emphasys-software.com <mailto:jrogers@emphasys-software.com> > > > -- > Sent via psycopg mailing list (psycopg@postgresql.org > <mailto:psycopg@postgresql.org>) > To make changes to your subscription: > http://www.postgresql.org/mailpref/psycopg > <http://www.postgresql.org/mailpref/psycopg> > > > > > -- > *Nahum Castro González* > Blvd. Perdigón 214, Brisas del Lago. > CP 37207 > León, Guanajuato, México > Tel (477)1950304 > Cel (477)1274694 -- Adrian Klaver adrian.klaver@aklaver.com