Python, GD och PIL.
Python, GD och PIL.
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.
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.
Re: Python, GD och PIL.
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å.
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å.
Re: Python, GD och PIL.
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.
Re: Python, GD och PIL.
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:
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:
Senast redigerad av sodjan 25 mars 2017, 14:42:40, redigerad totalt 1 gång.
Re: Python, GD och PIL.
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.
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.
Re: Python, GD och PIL.
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å.
Re: Python, GD och PIL.
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.
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.
Re: Python, GD och PIL.
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å.
Re: Python, GD och PIL.
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.
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.
Re: Python, GD och PIL.
Ä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)?
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)?
Re: Python, GD och PIL.
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å...
Edit: Om nu allt annat fanns i exempelform alltså...
Re: Python, GD och PIL.
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...
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...
Re: Python, GD och PIL.
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:
Skapar en PNG bild med detta innehåll:
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...
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()
$
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.
Re: Python, GD och PIL.
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").
När det körs får jag:
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...
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()
Kod: Markera allt
$ python GD_TEST.PY
PNG size: 539
String size: 2048
$
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...
Re: Python, GD och PIL.
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()