Portál AbcLinuxu, 30. dubna 2025 14:00
Máme jako na krku vánoce a novoroční pfka a určitě taky budete jako já posílat mailem hróóóóómady přáníček!! Někdo z vás třeba bude chtít posílat 'přáníčka' národnímu centru kybernetický bezpečnosti nebo NUKIBU nebo nějakej jinejm takovej těm a potřebuje nějaký jakože vysvětlení pro spoustu externích obrázků v mailíku a uplně nejlíp takový obrázky co každýho zaujmou. Proto mam pro vás uplně supr návod jak jako udělat blejskavej text pomocí pythonu a knihovny pillow ;D
Na netu už je spousta hotovejch online generátorů blejskavýho textu, mužete zkusit googlit 'glittering text generator' ale většinou neuměj naše znaky a taky je takový pitomí se s nima dělit o svuj textík protože nikdy nevíte co s nim jako mužou dělat a jestli ho třeba nevykecaj ještě dřív než svoje přáníčko pošlete a nezkazej vám překvapení :D
Muj skriptík je mnohem lepší a mužete si ho snadno upravit přebarvit a tak ;D
zdroják je dole
# -*- coding: utf-8 -*- #tenhleten řádek uplně nahoře umožňuje ve zdrojáku používat znaky textu kódování utf-8 #takže i český a slovenský to je taky důvod proč je muj skriptík 10000000x lepší než # většina online generátorů glittering textu ;D #použijeme grafickou knihovnu pillow from PIL import Image from PIL import ImageFont from PIL import ImageDraw import math from random import randint #text co chceme vykreslit #to účko před stringem řiká že to je unicode string text=u"Chceš taky?? tak čti ne asi!! ;D" #maximální povolená délka obrázku #320 je šířka toho okýnka co je tady u blogísků vpravo nahoře img_max_width=600 font_filename="SansitaOne.ttf" #cesta k souboru s fontíkem font_size=10 #minimální velikost fontíku font = ImageFont.truetype(font_filename, font_size) text_width=font.getsize(text)[0]#ixový rozměr textu == jeho délka v pixelech num_stars=30#počet hvězdiček vytvořených každým krokem animace output_filename=text+'.gif' #hvězdička!!!!! #chci aby textík jakoby jiskřil takže na něm budu #vykreslovat spoustu malilinkaťoučkejch hvězdiček :D :D #hvězdičku si mužete přectavit jako takový malinkatý kolečko ze kterýho #po celým jeho obvodu koukaj spičatý trojuhelníčky nevim jak ji jako líp popsat :D :D class Star: #statické proměné co patří celý třídě #obrázek s našim textem na transparentním pozadí #má význam v metodě findPos() maskImg=None #konstruktor #to self je asi něco jako ukazatel objektu na sebe samýho #asi něco třeba jako 'this' v jinejch jazycích #když ho v metodě chcete využít musí bejt i argumentem funkce #když metodu voláte z instance objektu tak se tam do argumentů nepíše #supr kravinka že tohleto 'self' def __init__(self,color): #x y poloha v obrázku #získá se z metody findPos() self.x=0 self.y=0 self.findPos() #barva hvězdičky self.color=color #délka paprsků hvězdičky self.rOut=3 #vnitřní průměr tělíčka hvězdičky self.rIn=1 #počet paprsků hvězdičky #náhodný celý čísílko z intervalu od 5 do 9 self.numPoints=randint(5,9) def draw(self,dest): #vykreslí do vstupního obrázku hvězdičku a celý obrázek vrací returnem points=[] #o kolik se zvedne úhel při každým vykreslení jednoho vrcholu hvězdičky #na střídačku vykrelujeme vrcholy paprsku a jakoby jejich patičku #protože je kreslíme v každým kroku po dvou tak to neni 360.0/numPoints ale 180.0 angleStep=(180.0/self.numPoints) ang=0.0 #výpočet vrcholů polygonu hvězdičky for i in range(self.numPoints): #vnější vrcholek hrotu paprsku hvězdičky x=int(math.cos(ang*math.pi/180.0)*self.rOut)+self.rOut y=int(math.sin(ang*math.pi/180.0)*self.rOut)+self.rOut #uložíme si souřadnici do políčka points.append((x,y)) ang+=angleStep #vnitřní x=int(math.cos(ang*math.pi/180.0)*self.rIn)+self.rOut y=int(math.sin(ang*math.pi/180.0)*self.rIn)+self.rOut points.append((x,y)) ang+=angleStep #obrázek o dýlce hrany průměru hvězdičky star=Image.new('RGBA', (self.rOut*2,self.rOut*2), (255,0,0,0)) #kreslidlo jednoduchý grafiky do obrázku #použijeme to na vykreslení našeho polygonku hvězdičky draw=ImageDraw.Draw(star) #vykreslíme polygon do obrázku draw.polygon(points,fill=self.color,outline=self.color) #obrázek vložíme do vstupního obrázku aby jako ležel svým středem na souřadnici (x,y) dest.paste(star,(int(self.x-star.size[0]/2),int(self.y-star.size[1]/2)),mask=star) return dest def findPos(self): #najde souřadnici která leží na písmenkách textu #si jako myslim že z týhletý funkce někdo muže dostat autistickej záchvat #protože teoreticky nikdy nemusí jeji běh skončit ale je to dost nepravděpodobný ;D #jistější postup by bylo si nazačátku určit množinu možnejch souřadnic a #z ní náhodně vybírat body to ale nestojí za námahu ;D x=0 y=0 while True: #nechceme ji hnedka u okraje textíku protože to je takový divný x=randint(5,Star.maskImg.size[0]-5) y=randint(5,Star.maskImg.size[1]-5) #pokud najdeme bílý pixel tak hurááááá máme souřadnici :D if Star.maskImg.getpixel((x,y))==(255,255,255,255): self.x=x self.y=y break #funkce co vytvoří obdelníček s barevným gradientem def color_gradient(wh,min_color,max_color): #wh = šířka a výška obrázku #min_color = barva dole #max_color = barva nahoře #vytvoříme si nový obrázek im_grad = Image.new("RGBA",wh,min_color) #metodou load získáme pole pixelů toho obrázku pixelmap=im_grad.load() w,h=wh #smícháme barvičky v poměru odpovídajícím vertikální vzálenosti řádku pixelů for y in range(h): for x in range(w): ratio=float(y)/h inv=1.0-ratio r=int(min_color[0]*ratio+max_color[0]*inv) g=int(min_color[1]*ratio+max_color[1]*inv) b=int(min_color[2]*ratio+max_color[2]*inv) a=int(min_color[3]*ratio+max_color[3]*inv) pixelmap[x,y]=(r,g,b,a) return im_grad #to bysme jako měli #teď najdeme co největší možnou velikost textu abysme co nejvíc využili maximální #povolenou ixovou velikost while True: font_size += 1 font=ImageFont.truetype(font_filename, font_size) text_width=font.getsize(text)[0] #pokud překročíme maximální povolenou ixovou velikost #tak maximální možná dýlka byla jako ta předchozí #takže o jedničku zmenšíme ;D if(text_width>img_max_width): font=ImageFont.truetype(font_filename, font_size-1) break img_wh=font.getsize(text) print("Vytvářím obrázek o šířce {0} a výšce {1} pixelů!".format(img_wh[0],img_wh[1])) img = Image.new("RGBA", img_wh,(255,255,255,0)) draw = ImageDraw.Draw(img) #na transparentní obrázek vykreslíme bíle náš text draw.text((0, 0),text,(255,255,255,255),font=font) #jednotlivé obrázky gif animace frames=[] #dvě sady hvězdiček vykreslovaných na textík stars1=[] stars2=[] #nastavíme statickou proměnou třídy Star na obrázek s textem #se to hodí v metodě Star.findPos() Star.maskImg=img for i in range(15): #vytvoříme si nový obrázek s gradientem grad = color_gradient(img_wh,(10,0,255,255),(240,200,255,255)) #im_mix bude výstupní obrázek jakože všechmo smíchaný dohromady im_mix=Image.new("RGBA", img_wh,(255,255,255,0)) #nejstaší hvězdičky přepišeme novejma z minulý iterace #zvětšíme je a vykreslíme do obrázku s gradientem stars1=stars2 for star in stars1: star.rIn+=1 star.rOut+=2 grad=star.draw(grad) #vytvoříne nový hvězdičky a taky je vykreslíme do obrázku gradientu stars2=[] for j in range(num_stars): s=Star((150,150,255,255)) grad=s.draw(grad) stars2.append(s) #nakonec do obrázku im_mix vložíme na souřadnici (0,0) obrázek grad #ale s maskou ve tvaru našeho textíku takže se tam vloží jenom průnik #obrázku grad s tím naším textíkem supr ;D im_mix.paste(grad,(0,0),mask=img) #a strčíme do pole jednotlivých obrázků animace frames.append(im_mix) #nakonec to celý uložíme frames[0].save( output_filename, format='GIF', append_images=frames[1:], save_all=True, duration=20, loop=0, transparency=0)
Tiskni
Sdílej:
Super :-)
A pod jakou licencí ten kód je? Doplň ji tam prosím. Ideálně GNU GPLv3.
Taky by se hodilo ten text načítat ze standardního vstupu a ne ho tam mít zadrátovaný v kódu. A když to uživatel spustí v terminálu, tak to můžeš poznat a zobrazit mu tam nějakou hlášku jako „sem zadejte text“, aby nebyl zmatený a neměl pocit, že se to zaseklo.
licenci mě vlastně vubec nenapadlo řešit :D :D
jinak tam se toho jako dá vylepšit mnóóóóhem víc :D :D text a parametry se standartního vstupu to je jasný. ještě by to šlo upravit že by všechny hvězdičky rovnou kreslily do obrázku 'grad' najednou a obešlo by se to bez toho paste a vytváření novýho obrázku každým voláním star.draw a tak dál. to ještě musim upravit ;D
Vytvářím obrázek o šířce 599 a výšce 48 pixelů!
Traceback (most recent call last):
File "blik.py", line 198, in module
grad=s.draw(grad)
File "blik.py", line 99, in draw
dest.paste(star,(self.x-star.size[0]/2,self.y-star.size[1]/2),mask=star)
File "/usr/lib/python3.8/site-packages/PIL/Image.py", line 1524, in paste
self.im.paste(im, box, mask.im)
TypeError: integer argument expected, got float
moje chyba!!!! teď by to snad mělo u tebe běžet. si myslim že jsem to včera jako pouštěla na stroji kde je ještě nastavenej jako výchozí python 2.7 ane trojka takže se to dělení chovalo jinak. když jsem to pustila tady pod trojkou tak to hodilo stejnou chybku :'(
teď by to už mělo běžet. joa budeš si tam muset nastavit nějakej font na řádku 20 ;D
jááááá!!!!! si myslim že když to odinstaluju tak rozbiju počítač tak tam je pořád jako default :D :D :D :D
a potopu světa ten tvuj psací stroj přežil nebo sis pak sekeromlatem vyrobil z šutrů novej?? ;D
uhlíková stopa je naprosto minmální protože se nebudou posílat papírový psaníčka a nebude s nima chodit třeba nějakej starej pošťák co si připaluje cigáro od cigára a zdálky to vypadá jakože taková malá parní lokomotiva ;D
jaktože jako minimální?? náš pošťák má po městě takový jakože svoje trasy po kterejch jako musí doručovat dopisy a balíčky a tak. normálně do toho nevidíš jak to jako maj mezi sebou pošťáci rozdělený. jenže jak náš pošťák hulí jedno cigáro za druhým tak z těch nedopalků nechává po tý svý trase takovou jakože stopu. ato je supr když jako víš že ti nese dopis a vidíš ho jak míjí barák ani se nerozmejšlí zastavit a hulí a jde furt dál. mužeš rychle vyběhnout z baráku a pronásledovat ho potý jeho uhlíkový stopě a pak mu vynadat že se ako ani nenamáhal zazvonit. a von se usměje zapálí si o cigaretu další cigaretu a řekně něco jako že už je nato zvyklej a jako přesně už věděl že za ním poběžíte a dá ti dopis.
a teď mi jako řekni co jinýho by mohli bejt ty nedopalky než jako uhlíková stopa??
když neumíš vysvětlit žeto neni uhlíková stopa tak to prostě bude uhlíková stopa ne asi :D :D :D :D
se válí v bahně ne asi hombré ;D
zaprvý nejsem žádná amigo a zadruhý jsem si fakt jako myslela že to pouštim v pythonu v trojce :'( se podivej třeba na závorky u printu jako :'( : '(
ste asi měli hodně zajímavou sexuální výchovu jestli ste tam jako probírali tohle hele ;D
si jako myslim že ty seš já a teď jenom zkoušíš mlžit ;D
sem slyšela že si umřel!!! prej něco s hlavou nebo takovýho něco
tykráááávo já dostala tučňáčka :D :D :D :D
díkec!!!!!!
Zkusil jsem si to spustit a dostal jsem tohle:
Traceback (most recent call last): File "blyskavy_text.py", line 9, in <module> from PIL import Image ModuleNotFoundError: No module named 'PIL'
Line 9 proto, protože jsem si na první řádek doplnil #!/usr/bin/env python3
.
Takže mi chybí modul 'PIL', ale co s tím?
A prosím tě, když budu třeba psát e-mail v Thunderbirdu, tak jak to do něj dostanu? Nebo jak se to dá dostat sem?
pip3 install Pillow
.
Napřed jsem musel nainstalovat pip3, což jsem udělal. A:
$ sudo pip3 install pillow Requirement already satisfied: pillow in /usr/lib/python3/dist-packages (7.0.0) $ python blyskavy_text.py Traceback (most recent call last): File "blyskavy_text.py", line 9, in <module> from PIL import Image ModuleNotFoundError: No module named 'PIL'
Začal jsem online kurz Pythonu. Tam tě vedou k instalaci Pythonu 3, ale když programuješ, tak dáváš jen python
, ne python3
. Tak nevím, nejsem programátor. Každopádně:
$ python3 blyskavy_text.py Traceback (most recent call last): File "blyskavy_text.py", line 9, in <module> from PIL import Image ModuleNotFoundError: No module named 'PIL'
Ještě doplním, že to spouštím z virtuálního prostředí (source venv/bin/activate
) a pak teprve python(3) blyskavy_text.py
. Ale to by ničemu vadit nemělo. IMHO.
Už dobrý, dík.
Ještě se zeptám. Když to vložím do mailu v Thunderbirdu, tak jsou ty hvězdičky statické. Proč?
A jen čistě teoreticky. Sem bych to vložil jak, třeba jako název blogu? Nechci to dělat, ale abych to uměl.
Když to vložím do mailu v Thunderbirdu, tak jsou ty hvězdičky statické. Proč?Jestli se to nezměnilo, tak je to statické jen v náhledu při psaní zprávy. V konceptech a nebo odeslané poště se to prý zobrazuje animované.
Sem bych to vložil jak, třeba jako název blogu? Nechci to dělat, ale abych to uměl.Nijak. Je to obrázek, ne text. Musel bys redakční systém donutit vložit někam do stránky HTML tag
img
.
Tak se to asi změnilo.
Díky za vše.
V konceptech a nebo odeslané poště se to prý zobrazuje animované
takle se mi to chová taky jakože ty gify v thunderbirdu :O :O při psaní se nehejbou hejbou až když je mail doručenej co sem testovala :O :O
Nepomohlo mi ani povolit vzdálený obsah. Napadá tě něco?
nevim. jakou máš verzi?? :O :O mě to jede v 78.6.0
Distribuční - 68.10.0
bojim se že tim to asi jako nebude ale možná zkus novější verzi jinak fakt jako nevim :O :O
Bug report:
Stáhl a nainstaloval jsem si ten font, který je použitý v kódu. Vše funguje, ale nezvlářá to "ř". Např. "č" ano. V čem je problém?
Takže místo
"á", "č", "ď", "é", "ě", "í", "ň", "ó", "ř", "š", "ť", "ú", "ů", "ý" a "ž"
to dělá jen
"á", "č", "é", "í", "ó", "š", "ú", "ý" a "ž".
Bude to asi ale tím fontem.
jj ty znaky tam asi jako fakt chyběj v tom fontu promiň :O :O
potřeba je nějakej unicode *.ttf font s těma českejma znakama třeba tendleten by měl fungovat hele
btw různý ty stránky na stahování fontů často umožňujou vložit nějakej svuj vlastní náhledovej/preview text takže je fakt asi jako dobrý tam napsat něco jako 'příliš žluťoučkej kůň pěl ďábelský ódin' a koukat jestli to ty fonty jakoby zobrazej správně i když sou voznačený jako unicode ;D
příliš žluťoučkej kůň pěl ďábelský ódinPůvodní příliš žluťoučký kůň trpěl ďábelské ódy obsahuje těch znaků víc :)
To je příšernej font. :D Mě se právě moc líbil ten v tom kódu. Ten se právě hodil třeba k přání. Škoda, že nemá všechny české znaky. Budu se muset po něčem podobném podívat.
Tak na 1001 Free Fonts jsem nenašel nic, co by se mi líbilo. A hledal jsem docela dlouho. Na Českých Fontech jsem našel alespoň tohle.
sem ho zkusila poeditovat když je teda jakoby free a ty znaky některý chybící tam jako přidat :O :O
editovanej font i ukázka v příloze komentu ;D
Tak to je super.
Díky moc!
Ještě ti tam chybí "Ě". Zkusil jsem se do toho podívat, ale mě se to zobrazuje jako rozsypaný čaj. Můžeš to prosím tě ještě opravit?
přidaný 'Ě' :D
si myslim žes to chtěl editovat jako texťák ;D na editování/upravovování fontů se používá fontforge třeba hele ;D
Ano, jako texťák.
Díky za úpravu, ochotu a trpělivost. :) Ještě mě něco naučíš. :)
tak supr :D nemáš zač ;D
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.