Python, GD och PIL.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Python, GD och PIL.

Inlägg av sodjan »

Jag har ett speciellt "case" och tänkte kolla om någon har pysslat med
de verktyg som jag tittar på just nu...

Problemet:
Vi använder skrivare från Zebra för etiketter. Dessa kan som standard
enbart skriva text i 0, 90, 180 och 270 graders vridning. Nu har det kommit
ett önskemål kring en märkning där etiketten er svagt böjd ("bananformad"),
dels ska texten skrivas något vriden, 5-10 grader eller så.

Funderingar:
Jag har kollat runt efter olika verktyg för att hantera grafiska bitmap bilder
i minnet, så att säga. Hittade LibGD som verkade lovande. Den kan skriva
TTF fonter i valfri vridning till "images".

https://libgd.github.io/

Sen såg jag också att GDmodule var förinstallerat i våran Python installation.

https://github.com/Solomoriah/gdmodule

Ser ut som att det skulle gå att skriva till en bitmap som motsvarar våra etiketter.

GD verkar inte (så vitt jag har kunnat se) ha direkt stöd för 1-bit S/V bitmaps (?).
Däremot verkar PIL, Python Imaging Library, ha stöd för bl.a. 1-bit bitmaps.

http://www.pythonware.com/products/pil/
http://effbot.org/imagingbook/pil-index.htm

Vad jag vill kunna göra är att skapa en "avbild" av etiketten on-the-fly, koda
den som hex och skapa samt skriva ZPL kod till skrivaren direkt utan att
gå över fysiska filer. Det verkar som att både GD och PIL har möjlighet
att jobba mot interna bilder utan att skriva till filer...

Så det vore intressant att höra om något har kört GDmodule och/eller PIL
från Python och om det verkar som att detta borde gå att lösa.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Jaha, vad det så udda prylar... :-)

Ingen som har kört GD/LibGD?

Nu så har projektet tag en delvis annan vändning och genom
lite omdesign av etiketten så kan vi sannolikt skriva vinkelrätt
och då fungerar det direkt med Zebra skrivarna så som de är.

Men intresset av att skapa etikett "images" on-the-fly kvarstår
ifall liknande behov skulle uppstå.
xxargs
Inlägg: 10183
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Python, GD och PIL.

Inlägg av xxargs »

Om jag minns rätt så kan inkscape skiva ut text efter en båge och krokig linje (som i sig kan göras osynlig), och man därifrån sedan får göra en bitmap och behandla vidare tills det passar printern.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Ok, ska kolla vad Inkscape är och om det går att köra i batch/detached i OpenVMS...

EDIT:
Äh, Inkscape var ju ett vanligt desktop program... :-)
Det är ingen användare som ska "rita", det ska genereras en
"bild" av en etikett som ska kodas och skickas som ZPL kod
till en Zebra skrivare av ungefär denna typ:

Bild
Senast redigerad av sodjan 25 mars 2017, 14:42:40, redigerad totalt 1 gång.
xxargs
Inlägg: 10183
Blev medlem: 23 september 2006, 14:28:27
Ort: Södertälje

Re: Python, GD och PIL.

Inlägg av xxargs »

Inkscape är vektorritarprogram för samma typer av uppgifter som tex. ms-visio - figurritningar etc. och sparar native i svg-format.

den är också väldigt bra på att öppna streck/vektorritningar från pdf om man behöver in och rota, byta färg, ändra linjetjocklek etc.
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Python, GD och PIL.

Inlägg av ahlsten »

Det var ganska tunt med info om PNG-formatet, men jag förstår det som att det går att skicka en lz-komprimerad GIF med base64 om man säger till om det i kommandot (ex. ~DG). Jag tycker det verkar som att allt finns isf? Spara 1-bit PNG med python har jag gjort någon gång när jag genererade qrkoder, ingen källkod tillgänglig dock, men det ska ju gå.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Vi ska alltså inte skapa etiketter i förväg, om det är det som ni menar (?)
Etiketterna ska skapas on-the-fly direkt innan den skriv ut. Vi har en ram
på ca en sekund för att skapa och skriva etiketten.

Och Inkscape (och liknande) är helt ute ur bilden, det är ju ett desktop program.
Det behöve kunna länkas till t.ex. C kod, men det ser även ut som att libGD
från Python skulle kunna fixa det. Verkar som sagt vara lite för udda... :-)

Problemet var här att det från början var krav på att skriva text i andra vinklar
än vad ZPL normalt klarar (0, 90, 180 och 270 grader). Men om vi kan hålla
oss till det så gör bara så som vi gör med alla andra etiketter...

> (ex. ~DG).

Ja visst, den änden har jag full koll på. Har programmerat Zebra skrivare med
ZPL i 30 år... :-) Det var rutinerna för att on-the-fly skapa grafiska bit-mappar
som egentligen det hela handlar om.
meconer
EF Sponsor
Inlägg: 492
Blev medlem: 27 april 2010, 20:07:46
Ort: Järfälla

Re: Python, GD och PIL.

Inlägg av meconer »

ImageMagick är scriptbart. Det är väl mest för bitmappar men jag skulle kika på det i alla fall. Finns säkert pythonbibliotek också.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Ja, ImageMagick känner jag till, men jag har mest sett det som ett CLI verktyg.

Jag behöver något som är callable från våra applikationer. Antingen direkt via C
kod eller körbart via Python. Att gå via Python är så klart lite långsammare, men
det går att ha en process med ett Python script som ligger i bakgrunden och väntar
på ett kommando via en mailbox (motsvarar ungefär en pipe i unix). Men jag antar
att det bli lite snabbare att länka libGD direkt till applikationen.

Problemet är att de flesta libGD exemplen slutar med att det skapas en fil, jag behöver
komma åt bitmap formatet i minnet och konvertera det till rätt grafik format till ZPL koden.
Användarvisningsbild
swesysmgr
Inlägg: 14158
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: Python, GD och PIL.

Inlägg av swesysmgr »

Är det Python2 eller Python 3 som används? Biblioteket du länkade till verkar rätt gammalt men det finns modernare ersättare t.ex. pillow.

Skall texten skrivas ut efter en rät linje som vinklas valfritt antal grader eller skall linjen texten följer vara en båge (som bågig banföljande text i Office Word Art)?
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Python, GD och PIL.

Inlägg av ahlsten »

Kan du inte skapa en fil-liknande ström till en minnesyta (något som liknar fmemopen i OpenVMS?) och spara bilden där? Sen kan ni ju köra base64 på den eller läsa den som hexadecimal.

Edit: Om nu allt annat fanns i exempelform alltså...
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Python2 i detta fall. Och om jag kan använda de förinstallerade kitten så är det bra.
http://www.vmspython.org/doku.php?id=do ... _jfppy0600

> Skall texten skrivas ut efter en rät linje som vinklas valfritt antal grader eller skall linjen texten följer vara en båge

I första fall det första, men i exemplen jag har så kan det även tolkas som det andra...
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Har fått ett litet testscript att i alla fall skriva en lutande text. Vinklen är
i radianer upptäckte jag, så 10.0 blev först lite underligt. 0.1 var bättre...

Detta skript:

Kod: Markera allt

$ type GD_TEST.PY

import gd, os, cStringIO, urllib2
os.environ["GDFONTPATH"] = "/$1$DGA2310/JES/TTF/"
FONT = "Pacifico"

def simple():
    im = gd.image((200, 200))
    white = im.colorAllocate((255, 255, 255))
    black = im.colorAllocate((0, 0, 0))

    im.string_ttf(FONT, 20.0, 0.1, (10, 100), "Hello Python", black)

    f=open("gd_test.png", "w")
    im.writePng(f)
    f.close()

simple()
$
Skapar en PNG bild med detta innehåll:
GD_TEST.PNG
Just nu en 32-bit "compressed bitmap", så den ska till 1-bit s/v och en "ren" bitmap.
Men det ska nog gå att fixa... Å så var inte fontfilen den bästa, jag bara högg en TTF
fil bland alla på min laptop... Så, lite bättre med ARIALN.TTF. So far so good...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python, GD och PIL.

Inlägg av sodjan »

Har lagt till lite för PIL (Python Imaging Library) för att få en bitmap.
Det är en import rad i början samt de två blocken på slutet, det ena
skapar en PNG image i minnet (i "png_img") och det andra använder
PIL for att skapa en sträng med bitmappen (i "pil_str").

Kod: Markera allt

import gd, os, cStringIO, urllib2
from PIL import Image

os.environ["GDFONTPATH"] = "/$1$DGA2310/JES/TTF/"

FONT = "ARIALN"

def simple():
    gd_im = gd.image((128, 128))

    white = gd_im.colorAllocate((255, 255, 255))
    black = gd_im.colorAllocate((0, 0, 0))

    gd_im.string_ttf(FONT, 20.0, 0.1, (50, 50), "XYZW", black)

    f=open("gd_test.png", "w")
    gd_im.writePng(f)
    f.close()

    f=cStringIO.StringIO()
    gd_im.writePng(f)
    png_img = f.getvalue()
    print "PNG size:", len(png_img)
    f.close()

    pil_im = Image.open(cStringIO.StringIO(png_img))
    pil_im2 = pil_im.convert("1")
    pil_str = pil_im2.tostring()
    print "String size:", len(pil_str)

simple()
När det körs får jag:

Kod: Markera allt

$ python GD_TEST.PY
PNG size: 539
String size: 2048
$
Och det stämmer ju att (128x128) / 8 = 2048, så det blir i alla fall
rätt storlek på bitmappen. Nu ska den bara läsas och hex konverteras
samt bakas in i lite ZPL kod för skrivaren. Undrar hur bitarna ligger i
strängen, om det är 8 "stående" bitar i varje byte, eller om varje byte
är 8 bitar i rad på samma rad i bitmappen... :humm:
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: Python, GD och PIL.

Inlägg av ahlsten »

Det gick väl att skicka som b64 också? Det vore kompaktare?

Kod: Markera allt

@@ -1,28 +1,28 @@
-    pil_str = pil_im2.tostring()
-    print "String size:", len(pil_str)
+    f = cStringIO.StringIO()
+    pil_im2.save(f,format="PNG")
+    print f.getvalue().encode('base64')
+    f.close()
Skriv svar