Thread: OT? plpython2u
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;
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;
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.
This is the query.
update personal set foto=ajustar(encode(foto, 'hex')::bytea);
update personal set foto=ajustar(encode(foto, 'hex')::bytea);
Thanks in advance.
Nahum
--
Nahum Castro González
Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
Cel (477)1274694Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
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. > > 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. > > 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": 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 -- Jonathan Rogers Socialserve.com by Emphasys Software jrogers@emphasys-software.com -- Jonathan Rogers Socialserve.com by Emphasys Software jrogers@emphasys-software.com
2016-10-20 13:06 GMT-05:00 Jonathan Rogers <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?
>
> 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.open
Again thanks.
Nahum
--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com
--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com
--
Sent via psycopg mailing list (psycopg@postgresql.org)
To make changes to your subscription:
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)1274694Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
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
Oh, Awesome.
Thanks a lot.
Nahum.
2016-10-20 14:47 GMT-05:00 Adrian Klaver <adrian.klaver@aklaver.com>:
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.htm l#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
------------------------------------------------------------ ------------------------------ ------------------------------ ----------
\x3c50494c2e496d6167652e496d61676520696d616765206d6f64653d52 47422073697a653d33303078323039 206174203078374639334331453233 3635303e
(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?h ighlight=Image#PIL.Image.froms tring
<http://pillow.readthedocs.io/en/3.4.x/reference/Image.html? highlight=Image#PIL.Image.from string>
http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?h ighlight=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
--
Nahum Castro González
Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
Cel (477)1274694Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
On 10/20/2016 12:52 PM, Nahum Castro wrote: > Oh, Awesome. > > Thanks a lot. FYI, I forgot to close the mem_file in the example I sent. > > Nahum. > > 2016-10-20 14:47 GMT-05:00 Adrian Klaver <adrian.klaver@aklaver.com > <mailto:adrian.klaver@aklaver.com>>: > > 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> > <mailto: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 > <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.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> > > <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> > <mailto: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> > <mailto:jrogers@emphasys-software.com > <mailto:jrogers@emphasys-software.com>> > > > -- > Sent via psycopg mailing list (psycopg@postgresql.org > <mailto:psycopg@postgresql.org> > <mailto: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> > <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 <mailto:adrian.klaver@aklaver.com> > > > > > -- > *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
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. > > 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. > > 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": 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 -- Jonathan Rogers Socialserve.com by Emphasys Software jrogers@emphasys-software.com