Ĉapitro 17 - Manipulado Bildoj
Subtenu la Aŭtoro: Aĉeti la libron sur Amazono aŭ
la libro / ebook pakaĵo rekte Neniu amelo Gazetaro .
Legi la aŭtora aliaj liberaj Python libroj:
manipulanta Bildoj
Se vi havas ciferecan fotilon aŭ eĉ se vi simple alŝutu fotojn de via
telefono al Facebook, vi probable kruco padojn kun cifereca bildo
dosierojn tutan tempon. Vi sciu kiel uzi bazan grafikan softvaron, kiel Microsoft Paint aŭ Peniko, aŭ eĉ pli progresintaj aplikoj kiel Adobe Photoshop. Sed se vi bezonas redaktanton masiva nombro de bildoj, redaktas ilin mane povas esti longeca, enuiga laboro.
Entajpu Python. Kapkuseno estas triaj Python modulo por interagi kun bildo dosierojn. La modulo havas plurajn funkciojn kiuj faras ĝin facila por okazi, regrandigi kaj redakti la enhavon de bildo.
Kun la potenco manipuli bildojn same vi kun programaro kiel Microsoft
Paint aŭ Adobo Photoshop, Pitono povas aŭtomate redakti centojn aŭ
milojn da bildoj kun facileco.
Komputilo Bildo Fundamentoj
Por manipuli bildo, vi devas kompreni la fundamentojn de kiel
komputiloj trakti koloroj kaj koordinatoj en bildoj kaj kiel vi povas
labori kun koloroj kaj koordinatoj en Pillow. Sed antaŭ daŭrigi, instalu la
pillow
modulo. Vidu Appendix A helpon instali triaj moduloj. Instali Pillow havis malgravajn ŝanĝojn. StackOverflow havas gvidilojn por instalo sur Windows kaj Mac . Por Linukso, kuri ŝvitas apt-get install python3-tk, ŝvitas apt-get install python3-dev, tiam ŝvitas pip3 instali kapkuseno.
Koloroj kaj RGBA Valoroj
Komputilaj programoj ofte reprezentas koloron en bildo kiel RGBA valoro. An RGBA valoro estas grupo de nombroj kiuj specifas la kvanton de ruĝaj, verdaj, bluaj, kaj alfa (aŭ travidebleco) en koloro. Ĉiu de ĉi tiuj komponantoj valoroj estas entjero de
0
(neniom) al 255
(la maksimumo). Tiuj RGBA valoroj estas atribuitaj al individuaj rastrumeroj;
pixel estas la plej malgranda punkto de sola koloro la komputilo ekrano
povas montri (kiel vi povas imagi, estas milionoj da pikseloj sur
ekrano). A rastrumero la RGB fikso diras gxin precize kion ombro de koloro devus montri. Bildoj ankaŭ havas alfa valoro krei RGBA valoroj.
Se bildo estas montrata sur la ekrano super fono bildo aŭ labortablo
wallpaper, la alfa valoro determinas kiom de la fono vi povas "travidi"
la bildo de pikselo.
En Pillow, RGBA valoroj estas reprezentitaj de opo de kvar entjeraj valoroj. Ekzemple, la koloro ruĝa estas reprezentita per
(255, 0, 0, 255)
.
Tiu koloro havas la maksimuman kvanton de ruĝa, neniu verda aŭ blua,
kaj la maksimuma alfa valoro, signifa ĝi estas plene opaka. Verda estas reprezentita de (0, 255, 0, 255)
, kaj blua estas (0, 0, 255, 255)
. Blanka, la kombino de ĉiuj koloroj, estas (255, 255, 255, 255)
, dum nigra, kiu ne havas koloro, estas (0, 0, 0, 255)
.
Se koloron havas alfa valoro de
0
, ĝi estas nevidebla kaj ĝi ne vere gravas kion la RGB valoroj. Post ĉiu, nevidebla ruĝa aspektas la sama kiel nevidebla nigra.
Kapkuseno uzas la normon koloro nomoj kiujn HTML uzas. Tabelo 17-1 listigas selektado de norma koloro nomoj kaj iliaj valoroj.
Tabelo 17-1. Norma Koloro Nomoj kaj Ilia RGBA Valoroj
nomo
|
RGBA Valoro
|
nomo
|
RGBA Valoro
|
---|---|---|---|
blanka
| (255, 255, 255, 255) |
ruĝa
| (255, 0, 0, 255) |
verda
| (0, 128, 0, 255) |
blua
| (0, 0, 255, 255) |
grizaj
| (128, 128, 128, 255) |
flavaj
| (255, 255, 0, 255) |
nigra
| (0, 0, 0, 255) |
purpuraj
| (128, 0, 128, 255) |
Kapkuseno proponas la
ImageColor.getcolor()
funkcio tiel vi ne devas enmemorigi RGBA valoroj por la kolorojn vi volas uzi. Tiu funkcio prenas koloron nomo ĉeno kiel ĝia unua argumento, kaj la ligilo 'RGBA'
kiel lia dua argumento, kaj ĝi redonas RGBA opo.
Vidi kiel tiu funkcio laboras, eniras la sekva en la interaga konko:
❶ >>> de PIL importado ImageColor ❷ >>> ImageColor.getcolor ( 'ruĝa', 'RGBA') (255, 0, 0, 255) ❸ >>> ImageColor.getcolor ( 'RED', 'RGBA') (255, 0, 0, 255) >>> ImageColor.getcolor ( 'Nigra', 'RGBA') (0, 0, 0, 255) >>> ImageColor.getcolor ( 'ĉokolado', 'RGBA') (210, 105, 30, 255) >>> ImageColor.getcolor ( 'CornflowerBlue', 'RGBA') (100, 149, 237, 255)
Unue, vi devas importi la
ImageColor
modulo de PIL ❶ (ne de Pillow, vi vidos kial en momento). La koloro nomo ŝnuro pasas al ImageColor.getcolor()
estas kazo sensenta, tiel pasante 'red'
❷ kaj pasante 'RED'
❸ doni vin la sama RGBA opo. Vi povas ankaŭ pasas pli nekutima koloro nomoj, kiel 'chocolate'
kaj 'Cornflower Blue'
.
Kapkuseno subtenas grandega nombro de koloro nomoj, de
'aliceblue'
al 'whitesmoke'
. Vi povas trovi la kompletan liston de pli ol 100 normo koloro nomoj en la rimedoj je http://nostarch.com/automatestuff/ . Koordinatoj kaj Skatolo opoj
Bildo rastrumeroj estas adresita per x- kaj y-koordinatoj, kiuj
respektive specifi rastrumero la horizontala kaj vertikala lokon en
bildo. La origino estas la rastrumero ĉe la supro-maldekstra angulo de la bildo kaj estas precizigita per la notacio (0, 0). La unua nulo reprezentas la x-koordinato, kiu komenciĝas je nulo ĉe la origino kaj pliigoj iranta de maldekstre al dekstre. La dua nulo reprezentas la y-koordinato, kiu komenciĝas je nulo ĉe la origino kaj pliigoj irante laŭ la bildo.
Tiu portas ripetante: y-koordinatoj pliigi iranta malsupre, kiu estas
la malo de kiel vi eble memoras y-koordinatoj uzitaj en math klaso. Figuro 17-1 montras kiel tiu koordinatsistemo funkcias.
Multaj de Pillow funkcioj kaj metodoj prenas skatolon opo argumento. Tio signifas Pillow atendas opo de kvar entjeraj koordinatoj kiuj reprezentas rektangulan regiono en bildo. La kvar entjeroj estas, en ordo, kiel sekvas:
Figuro 17-1. La x- kaj y-koordinatoj de 27 × 26 bildo de ia praa datumoj stokado aparato
- Maldekstre: La x-koordinato de la maldekstra rando de la skatolo.
- Top: La y-koordinato de la supro eĝo de la skatolo.
- Dekstra: La x-koordinato de unu rastrumero al la dekstra de la dekstra rando de la skatolo. Ĉi entjero devas esti pli granda ol la maldekstra entjero.
- Fundo: La y-koordinato de unu rastrumero malaltaj ol la fundo rando de la skatolo. Ĉi entjero devas esti pli granda ol la supro entjero.
Figuro 17-2. La areo reprezentita de la skatolo opo
(3, 1, 9, 6)
Notu ke la skatolo inkludas la maldekstra kaj supro koordinatoj kaj tusxus sed ne inkluzivas la rajton kaj fundo koordinatoj. Ekzemple, la skatolo opo
(3, 1, 9, 6)
reprezentas ĉiujn rastrumeroj en la nigran skatolon en Figuro 17-2 . Manipulanta Bildoj kun Pillow
Nun ke vi scias kiel koloroj kaj kunordigas laboron en Pillow, ni uzu Pillow manipuli bildon. Figuro 17-3 estas la bildo kiu estos uzata por ĉiuj interaga ŝelon ekzemploj en ĉi tiu ĉapitro. Vi povas elŝuti ĝin de http://nostarch.com/automatestuff/ .
Unufoje vi havas la dosiertipo Zophie.png en via nuna labordosierujon, vi estos preta ŝargi la bildon de Zophie en Python, kiel tia:
>>> De PIL importado Bildo >>> CatIm = Image.open ( 'zophie.png')
Figuro 17-3. Mia kato Zophie. La ĉambro aldonas 10 funtoj (kio estas multe por kato).
Ŝargi la bildon, vi importi la
Image
modulo de Pillow kaj nomas Image.open()
, pasante ĝin la statuo dosiernomo. Vi povas tiam stoki la ŝarĝitaj bildo en variablo kiel CatIm
. La modulo nomo de Pillow estas PIL
fari ĝin dorsen kongrua kun malnova modulo nomata Python Imaging Biblioteko, kio estas kial vi devas kuri from PIL import Image
anstataŭ from Pillow import Image
. Pro la maniero Pillow kreintoj starigis pillow
modulo, vi devas uzi la from PIL import Image
formo de import
deklaro, prefere ol simple import PIL
.
Se la dosiertipo estas ne en la nuna labordosierujon, ŝanĝi la
laboranta dosierujo al la dosierujo kiu enhavas la bildon dosiero
nomante la
os.chdir()
funkcio. >>> Import os >>> Os.chdir ( 'C: \\ folder_with_image_file')
La
Image.open()
redonas la valoron la Image
objekto datumtipo, kiu estas kiel Pillow reprezentas bildon kiel Python valoro. Vi povas ŝarĝi Image
objekto de bildo dosiero (de ajna formato) aprobante la Image.open()
funkcio kordo de la dosiernomo. Ĉiuj ŝanĝoj vi faras al la Image
objekto povas esti savita al dosiero dosieron (ankaŭ de ajna formato) kun la save()
metodo. Ĉiuj turnadoj, regrandigi, tondadon, tirante, kaj aliaj bildoj manipuladoj estos farita tra telefono vokas ĉi Image
objekto.
Mallongigi la ekzemploj en ĉi tiu ĉapitro, mi supozas vi importitaj Pillow la
Image
modulo kaj ke vi havas la Zophie bildo stokitaj en variablo nomata catIm
. Certiĝu ke la zophie.png dosiero estas en la nuna labordosierujon tiel ke la Image.open()
funkcio povas trovi ĝin. Alie, vi ankaŭ devas doni la plenan absolutan vojon en la kordo argumento por Image.open()
. Laborante kun la bilda Datumoj Tipo
An
Image
objekto havas plurajn utilajn ecojn kiuj donas vin bazajn informojn pri
la bildo dosiero estis ŝarĝita de: ĝia larĝo kaj alteco, la dosiernomo
kaj la grafiko formato (kiel JPEG, GIF, aŭ PNG).
Ekzemple, tajpu la sekvajn en la interaga konko:
>>> De PIL importado Bildo >>> CatIm = Image.open ( 'zophie.png') >>> catIm.size ❶ (816, 1088) ❷ >>> larĝeco, alteco = catIm.size ❸ >>> larĝeco 816 ❹ >>> alteco 1088 >>> catIm.filename 'Zophie.png' >>> catIm.format 'PNG' >>> catIm.format_description 'Portebla reto grafiko' ❺ >>> catIm.save ( 'zophie.jpg')
Post fari
Image
objekto de Zophie.png kaj stokante la Image
objekto en catIm
, ni povas vidi ke la objekto size
atributo enhavas opo de la bildo de larĝeco kaj alteco en pikseloj ❶. Ni povas atribui valorojn en la opo al width
kaj height
variabloj ❷ por konsenti kun larĝa ❸ kaj alteco ❹ individue. La filename
atributo priskribas la originala dosiernomo. La format
kaj format_description
atributoj estas kordoj kiuj priskribas la bildo formato de la originala dosiero (kun format_description
esti iom pli abundajn).
Fine, nomante la
save()
metodo kaj pasante ĝin 'zophie.jpg'
ŝparas novan bildon kun la dosiernomo zophie.jpg al via fiksita disko ❺. Kapkuseno vidas ke la dosiersufikso estas .jpg kaj aŭtomate savas la bildon uzante la JPEG bildo formato. Nun vi devus havi du bildojn, zophie.png kaj zophie.jpg, sur via malfacila stirado. Dum tiuj dosieroj estas bazita sur la sama bildo, ne estas identaj pro iliaj malsamaj formatoj.
Kapkuseno ankaŭ provizas la
Image.new()
funkcio, kiu redonas Image
celoj multe kiel Image.open()
, krom la bildo reprezentas Image.new()
's objekto estos malplena. La argumentoj por Image.new()
estas kiel sekvas: - La kordo
'RGBA'
, kiu fiksas la koloro regimon RGBA. (Estas aliaj manieroj kiuj ĉi libro ne iras en.) - La grandeco, kiel du-entjera opo de la nova bildo de larĝeco kaj alteco.
- La fonkoloro ke la bildo devus komenci kun, kiel kvar-entjera opo de RGBA valoro. Vi povas uzi la reveno valoro de la
ImageColor.getcolor()
funkcion por ĉi argumenton. Alternative,Image.new()
ankaŭ apogas nur pasante la ŝnuro de la norma koloro nomon.
Ekzemple, tajpu la sekvajn en la interaga konko:
>>> De PIL importado Bildo ❶ >>> im = Image.new ( 'RGBA', (100, 200), 'purpura') >>> Im.save ( 'purpleImage.png') ❷ >>> im2 = Image.new ( 'RGBA', (20, 20)) >>> Im2.save ( 'transparentImage.png')
Tie ni krei
Image
objekto por bildon kiu estas 100 rastrumeroj larĝa kaj 200 rastrumeroj alta, kun purpura fono ❶. Tiu bildo estas poste savis la dosieron purpleImage.png. Ni nomas Image.new()
denove krei alian Image
celon, tiu tempon pasanta (20, 20) por la dimensioj kaj nenion por la fonkoloro ❷. Nevidebla nigra, (0, 0, 0, 0)
, estas la defaŭlta koloro uzita se neniu koloro argumento estas specifita, do la dua bildo havas travideblan fonon; Ni savu tiu 20 × 20 travidebla placo transparentImage.png. tondadon Bildoj
Tondadon bildo signifas elektanta rektangula regiono interne bildo kaj forigante ĉiu ekster la rektangulo. La
crop()
metodon sur Image
objektoj prenas skatolon opo kaj redonas Image
objekto reprezentanta la altranĉita bildo. La tondadon ne okazas en loko-tio estas, la originala Image
objekto estas lasita netuŝita, kaj la crop()
metodo revenas nova Image
objekto.
Remeber ke boksis opo -en ĉi tiu kazo, la detonditaj sekcio-inkludas la
maldekstra kolumno kaj supera vico de pikseloj sed nur tusxus kaj ne inkludas la dekstra kolumno kaj malsupro vico de píxeles.
Eniri la sekva en la interaga konko:
>>> CroppedIm = catIm.crop ((335, 345, 565, 560)) >>> CroppedIm.save ( 'cropped.png')
Ĉi faras novan
Image
objekto por la altranĉita bildo, stokas la celon en croppedIm
kaj tiam alvokas save()
sur croppedIm
savi la altranĉita bildo en cropped.png. La nova dosiero cropped.png kreiĝos de la originala bildo, kiel en Figuro 17-4 .
Figuro 17-4. La nova bildo estos nur la detonditaj sekcio de la originala bildo.
Kopii kaj Alglui Bildoj sur Aliaj Bildoj
La
copy()
metodo revenos nova Image
objekto kun la sama bildo kiel la Image
objekto tuŝis. Tio estas utila se vi bezonas por fari ŝanĝojn bildon sed ankaŭ volas konservi netuŝita versio de la originalo. Ekzemple, tajpu la sekvajn en la interaga konko: >>> CatIm = Image.open ( 'zophie.png') >>> CatCopyIm = catIm.copy ()
La
catIm
kaj catCopyIm
variabloj enhavas du apartajn Image
objektoj, kiuj ambaŭ havas la saman bildon pri ili. Nun ke vi havas Image
objekto stokitaj en catCopyIm
, vi povas modifi catCopyIm
laŭplaĉe kaj savi ĝin al nova dosiernomo, lasante zophie.png netuŝita. Ekzemple, ni provu modifi catCopyIm
kun la paste()
metodo.
La
paste()
metodo nomata sur Image
objekto kaj almetas alian bildon sur supron. Ni daŭrigos la ŝelo ekzemple per intergluajn pli malgrandan bildon sur catCopyIm
. >>> FaceIm = catIm.crop ((335, 345, 565, 560)) >>> faceIm.size (230, 215) >>> CatCopyIm.paste (faceIm, (0, 0)) >>> CatCopyIm.paste (faceIm, (400, 500)) >>> CatCopyIm.save ( 'pasted.png')
Unue ni pasas
crop()
skatolo opo por la rektangula areo en zophie.png kiu enhavas Zophie vizaĝo. Tio kreas Image
objekto reprezentante 230 × 215 kropo, kiun ni stokas en faceIm
. Nun ni povas almeti faceIm
sur catCopyIm
. La paste()
metodo prenas du argumentojn: estas "fonto" Image
objekto kaj opo de la x- kaj y-koordinatoj kie vi volas almeti la supro-maldekstra angulo de la fonto Image
objekto sur la ĉefa Image
objekto. Tie ni nomas paste()
dufoje sur catCopyIm
, pasante (0, 0) unuafoje kaj (400, 500), duan fojon. Ĉi pastoj faceIm
sur catCopyIm
dufoje: unufoje kun la pinta-maldekstra angulo de faceIm
je (0, 0) sur catCopyIm
, kaj unufoje kun la pinta-maldekstra angulo de faceIm
ĉe (400, 500). Fine, ni savu la modifita catCopyIm
al pasted.png. La pasted.png bildo aspektas kiel Figuro 17-5 .
Figuro 17-5. Zophie la kato, kun ŝia vizaĝo batitaj dufoje
noto
Spite sian nomon, la
copy()
kaj paste()
metodoj en Pillow ne uzu vian komputilon la tondujo.
Notu ke la
paste()
metodo modifas lian Image
objekto en loko; ĝi ne revenos al Image
objekto kun la almetita bildo. Se vi volas nomi paste()
sed ankaŭ teni netuŝita versio de la originala bildo ĉirkaŭe, vi bezonos unua kopii la bildon kaj tiam nomita paste()
en tiu teksto.
Diru vi volas kahelo Zophie kapo trans la tutan bildon, kiel en Figuro 17-6 . Vi povas atingi tiun efikon kun nur paro
for
cikloj. Daŭrigi la interaga ŝelo ekzemplo enmetante la sekvaj: >>> CatImWidth, catImHeight = catIm.size >>> FaceImWidth, faceImHeight = faceIm.size ❶ >>> catCopyTwo = catIm.copy () ❷ >>> por maldekstra en gamo (0, catImWidth, faceImWidth): ❸ por pinto en gamo (0, catImHeight, faceImHeight): print (maldekstre, supre) catCopyTwo.paste (faceIm, (maldekstre, supre)) 0 0 0 215 0 430 0 645 0 860 0 1075 230 0 230 215 --snip-- 690 860 690 1075 >>> CatCopyTwo.save ( 'tiled.png')
Tie ni stoki la larĝo de alteco de
catIm
en catImWidth
kaj catImHeight
. Ĉe ❶ ni faras kopion de catIm
kaj stoki ĝin en catCopyTwo
. Nun ke ni havas kopion kiu ni povas almeti sur, Ni komencas looping algluota faceIm
sur catCopyTwo
. La ekstera for
buklo la left
variablo komenciĝas ĉe 0 kaj pliigas faceImWidth(230)
❷. La interna for
ciklo la top
variablo komencas je 0 kaj pliigas faceImHeight(215)
❸. Tiuj nestitaj for
maŝojn produkti valorojn por left
kaj top
entajpi krado de faceIm
bildojn super la catCopyTwo Image
objekto, kiel en Figuro 17-6 . Vidi nian nestitaj maŝojn laboras, ni presi left
kaj top
. Post la interglui estas kompleta, ni savu la modifita catCopyTwo
al tiled.png.
Figuro 17-6. Nestitaj
for
maŝojn uzita kun paste()
duobligi la kato vizaĝo (a duplicat, se vi volas). Regrandigi Bildo
La
resize()
metodo nomata sur Image
objekton kaj redonas novan Image
objekto de la specifita larĝo kaj alteco. Ĝi akceptas du-entjera opo argumento, reprezentante la nova larĝo kaj alto de la revenis bildo. Eniri la sekva en la interaga konko: ❶ >>> larĝeco, alteco = catIm.size ❷ >>> quartersizedIm = catIm.resize ((int (larĝo / 2), int (alteco / 2))) >>> QuartersizedIm.save ( 'quartersized.png') ❸ >>> svelteIm = catIm.resize ((larĝo, alto + 300)) >>> SvelteIm.save ( 'svelte.png')
Tie ni atribui la du valoroj en la
catIm.size
opo por la variabloj width
kaj height
❶. Uzante width
kaj height
anstataŭ catIm.size[0]
kaj catIm.size[1]
faras la reston de la kodo pli legebla.
La unua
resize()
alvoko pasas int(width / 2)
por la nova larĝa kaj int(height / 2)
por la nova alteco ❷, do la Image
objekto revenis post resize()
estos la duono la longo kaj larĝo de la originala bildo , aŭ unu-kvarono de la originala bildo grandeco supertuto. La resize()
metodo akceptas nur entjeroj en lia opo argumento, tial vi bezonas enpaki ambaŭ dividoj de 2
en int()
alvoko.
Ĉi regrandigo tenas la samajn proporciojn por la larĝeco kaj alteco. Sed la nova larĝo kaj alteco pasis al
resize()
ne devas esti proporcia al la originala bildo. La svelteIm
variablo enhavas Image
objekto kiu havas la originalan larĝa sed altecon kiu estas 300 rastrumeroj alta ❸, donante Zophie pli maldikaj rigardo.
Notu ke la
resize()
metodo ne redakti la Image
objekto en loko sed anstataŭe resendas novan Image
objekto. Turnanta kaj Flipping Bildoj
Bildoj povas esti rotaciita kun la
rotate()
metodon, kiu resendas novan Image
objekto de la turnita bildo kaj lasas la originalan Image
objekto senŝanĝa. La argumento por rotate()
estas ununura entjero aŭ flosi reprezentanta la numeron de gradoj turni la bildon kontraŭhorloĝnadla. Eniri la sekva en la interaga konko: >>> CatIm.rotate (90) .save ( 'rotated90.png') >>> CatIm.rotate (180) .save ( 'rotated180.png') >>> CatIm.rotate (270) .save ( 'rotated270.png')
Notu kiel oni povas ĉeno metodo alvokoj nomante
save()
rekte sur la Image
objekto cxesis rotate()
. La unua rotate()
kaj save()
alvoko faras novan Image
objekto reprezentas la bildon rotaciita kontraŭhorloĝnadla de 90 gradoj kaj savas la turnita bildon rotated90.png. La dua kaj tria alvokoj faras la saman, sed kun 180 degress kaj 270 degress. La rezultoj aspektas kiel Figuro 17-7 .
Figuro 17-7. La originala bildo (maldekstre) kaj la bildo rotaciita kontraŭhorloĝnadla de 90, 180 kaj 270 gradoj
Rimarku ke la larĝeco kaj alteco de la bildo ŝanĝo kiam la bildo estas rotaciita 90 aŭ 270 gradoj. Se vi turni bildon de iu alia kvanto, la originalaj dimensioj de la bildo estas subtenita. En Windows, nigra fono kutimas plenigi ajna breĉoj farita per la rotacio, kiel en Figuro 17-8 . Sur OS X, travideblajn punktoj estas uzataj por la breĉoj anstataŭe.
La
rotate()
metodo havas laŭvolan expand
ŝlosilvorto argumento kiu povas esti agordita por True
pligrandigi la dimensiojn de la bildo konveni la tutan turnita nova bildo. Ekzemple, tajpu la sekvajn en la interaga konko: >>> CatIm.rotate (6) .save ( 'rotated6.png') >>> CatIm.rotate (6, pligrandigi = Vera) .save ( 'rotated6_expanded.png')
La unua alvoko rotacias la bildo 6 gradoj kaj savas rotate6.png (vidu la bildon maldekstre de Figuro 17-8 ). La dua alvoko rotacias la bildo 6 gradoj
expand
starigis al True
kaj savas rotate6_expanded.png (vidu la bildon dekstre de Figuro 17-8 ).
Figuro 17-8. La bildo rotaciita 6 gradoj normale (maldekstre) kaj kun
expand=True
(dekstra)
Vi povas ankaŭ akiri "spegulo flip" de bildo kun la
transpose()
metodo. Vi devas pasi ĉu Image.FLIP_LEFT_RIGHT
aŭ Image.FLIP_TOP_BOTTOM
al la transpose()
metodo. Eniri la sekva en la interaga konko: >>> CatIm.transpose (Image.FLIP_LEFT_RIGHT) .save ( 'horizontal_flip.png') >>> CatIm.transpose (Image.FLIP_TOP_BOTTOM) .save ( 'vertical_flip.png')
Kiel
rotate()
, transpose()
kreas novan Image
objekto. Tie estis enirpermesilo Image.FLIP_LEFT_RIGHT
turni la bildon horizontale kaj konservi la rezulton al horizontal_flip.png. Turni la bildon vertikale, ni pasas Image.FLIP_TOP_BOTTOM
kaj savi al vertical_flip.png. La rezultoj aspektas kiel Figuro 17-9 .
Figuro 17-9. La originala bildo (maldekstre), horizontalaj flip (centro), kaj vertikala flip (dekstra)
Ŝanĝi Individuaj pikseloj
La koloro de individuo rastrumero povas rekuperi aŭ aro kun la
getpixel()
kaj putpixel()
metodoj. Tiuj metodoj ambaŭ prenas opo reprezentanta la x- kaj y-koordinatoj de la rastrumero. La putpixel()
metodo ankaŭ prenas kroman opo argumento por la koloro de la pikselo. Tiu koloro argumento estas kvar-entjeraj RGBA opo aŭ tri-entjeraj RVB opo. Eniri la sekva en la interaga konko: ❶ >>> im = Image.new ( 'RGBA', (100, 100)) ❷ >>> im.getpixel ((0, 0)) (0, 0, 0, 0) ❸ >>> por x en gamo (100): por y en gamo (50): ❹ im.putpixel ((x, y), (210, 210, 210)) >>> De PIL importado ImageColor ❺ >>> por x en gamo (100): por y en gamo (50, 100): ❻ im.putpixel ((x, y), ImageColor.getcolor ( 'darkgray', 'RGBA')) >>> Im.getpixel ((0, 0)) (210, 210, 210, 255) >>> Im.getpixel ((0, 50)) (169, 169, 169, 255) >>> Im.save ( 'putPixel.png')
Ĉe ❶ ni faru novan bildon kiu estas 100 × 100 travidebla kvadrato. Nomante
getpixel()
sur kelkaj koordinatojn en tiu bildo revenoj (0, 0, 0, 0)
ĉar la bildo estas travidebla ❷. Kolori rastrumeroj en ĉi bildo, ni povas uzi nestitaj for
masxojn iri tra ĉiuj pixeles en la supra duono de la bildo ❸ kaj kolora ĉiu rastrumero uzante putpixel()
❹. Tie ni pasas putpixel()
la RGB opo (210, 210, 210)
, helgriza.
Ke ni volas kolorigi la malsupera duono de la bildo malhelgrizaj sed ne scias la RGB opo por malhelgrizaj. La
putpixel()
metodo ne akceptas norma koloro nomon kiel 'darkgray'
, do vi devas uzi ImageColor.getcolor()
por akiri koloron opo de 'darkgray'
. Buklo tra la pixeles en la malsupera duono de la bildo ❺ migru putpixel()
la reveno valoro de ImageColor.getcolor()
❻, kaj vi devus nun havas bildon kiu estas helgriza en ĝia supra duono
kaj malhelgrizaj en la malsupera duono , kiel montrita en Figuro 17-10 . Vi povas voki getpixel()
sur kelkaj koordinatoj konfirmi ke la koloro en ajna donita rastrumero estas kion vi atendas. Fine, savi la bildon al putPixel.png.
Figuro 17-10. La putPixel.png bildo
Kompreneble, tirante unu rastrumero samtempe sur bildo ne estas tre oportuna. Se vi bezonas desegni formojn, uzi la
ImageDraw
funkcioj klarigis poste en tiu ĉapitro. Projekto: Aldono Logo
Diru vi havas la enuiga tasko de regrandigi miloj da bildoj kaj aldonante malgranda logo filigrano al la angulo de ĉiu. Farante ĉi tion kun bazaj grafikaĵoj programon kiel Peniko aŭ Paint prenus ĉiam. A amatoro grafikaĵoj apliko kiel Photoshop povas fari batch prilaborado, sed ke programaro kostas centojn de dolaroj. Ni skribi skripton por fari ĝin anstataŭe.
Diri ke Figuro 17-11
estas la logoo vi volas aldoni al la malsupro-dekstra angulo de ĉiu
bildo: nigra kato ikono kun blanka limo, kun la resto de la bildo
travidebla.
Figuro 17-11. La logo esti aldonita al la bildo.
Je alta nivelo, jen kion la programo faru,
- Montru la logo bildo.
- Buklo super ĉiu Png kaj .jpg dosieroj en la laboranta dosierujo.
- Kontrolu, ĉu la bildo estas pli larĝa aŭ pli alta ol 300 pikseloj.
- Se tiel, redukti la larĝa aŭ alteco (whikever estas pli granda) al 300 pixeles kaj grimpi malsupren la alia dimensio proporcie.
- Alglui la logo bildo en la angulo.
- Savi la ŝanĝita bildojn al alia dosierujo.
Tio signifas la kodo devas fari la sekvajn:
- Malfermu catlogo.png dosiero kiel
Image
objekto. - Buklo super la kordoj cxesis
os.listdir('.')
. - Akiri la larĝeco kaj alteco de la bildo de la
size
atributo. - Kalkuli la nova larĝo kaj alto de la malpligrandigeblaj bildo.
- Voku la
resize()
metodo por regrandigi la bildon. - Nomas la
paste()
metodo por alglui la logoo. - Voku la
save()
metodo por savi la ŝanĝojn, uzante la originala dosiernomo.
Paŝo 1: Malfermu la Logo Bildo
Por tiu projekto, malfermi novan dosieron redaktanto fenestro, tajpu la sekvan kodon, kaj konservi ĝin kiel resizeAndAddLogo.py:
#! python3 # ResizeAndAddLogo.py - Resizes ĉiuj bildoj en aktuala labordosierujon konveni # En 300x300 kvarangula aldonas catlogo.png al la suba-dekstra angulo. import os de PIL importado Bildo ❶ SQUARE_FIT_SIZE = 300 ❷ LOGO_FILENAME = 'catlogo.png' ❸ logoIm = Image.open (LOGO_FILENAME) ❹ logoWidth, logoHeight = logoIm.size # TODO: Loop super ĉiuj dosieroj en la labordosierujon. # TODO: Kontroli se bildo devas esti regrandigo. # TODO: Kalkuli la nova larĝo kaj alteco regrandigi al. # TODO: Regrandigi la bildon. # TODO: Aldonu la logoo. # TODO: Konservi ŝanĝojn.
Starigante la
SQUARE_FIT_SIZE
❶ kaj LOGO_FILENAME
❷ konstantoj en la komenco de la programo, ni faris ĝin facile ŝanĝi la programon poste.
Diru la logo kiu vi aldonas ne la kato ikono, aŭ diru vi reduktante la
eligo bildoj 'plej granda dimensio al io alia ol 300 pikseloj.
Kun tiuj konstantoj en la komenco de la programo, vi povas simple
malfermi la kodon, ŝanĝi tiujn valorojn unufoje, kaj vi faris.
(Aŭ vi povas fari ĝin tiel ke la valoroj por tiuj konstantoj estas
prenitaj el la komandlinio argumentoj.) Sen tiuj konstantoj, oni kredus
anstataŭ devi serĉi la kodon por ĉiuj okazoj de 300
kaj 'catlogo.png'
kaj anstataŭigi ilin per la valoroj por via nova projekto. Mallonge, uzante konstantoj faras via programo pli ĝeneraligita.
La logo
Image
objekto revenis de Image.open()
❸. Legebla, logoWidth
kaj logoHeight
estas atribuitaj al la valoroj de logoIm.size
❹.
La resto de la programo estas skeleto de
TODO
komento ĝis nun. Paŝo 2: Loop Super Ĉiuj dosieroj kaj Open Bildoj
Nun vi devas trovi ĉiujn .png dosieron kaj .jpg dosieron en la aktuala labordosierujon.
Notu ke vi ne volas aldoni la logo bildo por la logo bildo mem, do la
programo devas salti ajnan bildon kun dosiernomo jen la sama kiel
LOGO_FILENAME
. Aldonu la jenan al via kodo #! python3 # ResizeAndAddLogo.py - Resizes ĉiuj bildoj en aktuala labordosierujon konveni # En 300x300 kvarangula aldonas catlogo.png al la suba-dekstra angulo. import os de PIL importado Bildo --snip-- os.makedirs ( 'withLogo', exist_ok = Vera) # Loop super ĉiuj dosieroj en la labordosierujon. ❶ por dosiernomo en os.listdir ( '.'): ❷ se ne (filename.endswith ( '. Png') aŭ filename.endswith ( '. Jpg)) \ aŭ dosiernomo == LOGO_FILENAME: ❸ daŭrigi # salti ne- bildo dosierojn kaj la logo dosieron mem ❹ im = Image.open (dosiernomo) larĝeco, alteco = im.size --snip--
Unue, la
os.makedirs()
alvoko kreas withLogo dosierujo por stoki la finita bildojn kun logotipoj, anstataŭ superskribi la originala bildo dosierojn. La exist_ok=True
ŝlosilvorto argumento tenos os.makedirs()
el levante escepto se withLogo jam ekzistas. Dum looping tra ĉiuj dosieroj en la laboranta dosierujo kun os.listdir('.')
❶, la longaj if
aserto ❷ ĉekojn ĉu ĉiu dosiernomo ne finiĝas per .png aŭ .jpg. Se jes-aŭ se la dosiero estas la logo bildo mem-tiam la buklo devus salti ĝin kaj uzi continue
❸ iri al la sekvanta dosiero. Se filename
faras finon kun '.png'
aŭ '.jpg'
(kaj ne la logoo dosiero), vi povas malfermi ĝin kiel Image
objekto ❹ kaj starigis width
kaj height
. Paŝo 3: Regrandigi la Bildoj
La programo devus regrandigi la bildon nur se la larĝo aŭ alto estas pli granda ol
SQUARE_FIT_SIZE
(300 rastrumeroj, en tiu kazo), do meti ĉiuj la regrandigo kodon ene de if
deklaro kiu kontrolas la width
kaj height
variabloj. Aldonu la sekvan kodon al via programo: #! python3 # ResizeAndAddLogo.py - Resizes ĉiuj bildoj en aktuala labordosierujon konveni # En 300x300 kvarangula aldonas catlogo.png al la suba-dekstra angulo. import os de PIL importado Bildo --snip-- # Kontroli se bildo devas esti regrandigo. se larĝeco> SQUARE_FIT_SIZE kaj alteco> SQUARE_FIT_SIZE: # Kalkuli la nova larĝo kaj alteco regrandigi al. se larĝeco> alteco: ❶ alteco = int ((SQUARE_FIT_SIZE / larĝeco) * alteco) larĝeco = SQUARE_FIT_SIZE alie: ❷ larĝeco = int ((SQUARE_FIT_SIZE / alto) * larĝo) alteco = SQUARE_FIT_SIZE # Regrandigi la bildon. print ( 'regrandigo% s ...'% (dosiernomo)) ❸ im = im.resize ((larĝo, alto)) --snip--
Se la bildo ne bezonas esti regrandigo, vi bezonos por eltrovi ĉu ĝi estas larĝa aŭ alta bildo. Se
width
estas pli granda ol height
, tiam la alteco devus esti reduktita per la sama proporcio kiu la larĝeco estus reduktita ❶. Tiu proporcio estas la SQUARE_FIT_SIZE
valoro dividita per la nuna larĝo. La nova height
valoro estas tiu proporcio multiplikita de la aktuala height
valoro. Ekde la divido operatoro resendas kaleŝego valoron kaj resize()
postulas la dimensioj esti entjeroj, memoru konverti la rezulton al entjero kun la int()
funkcio. Fine, la nova width
valoro estos simple metita SQUARE_FIT_SIZE
.
Se
height
estas pli granda ol aŭ egala al la width
(ambaŭ kazoj estas manipulitaj en la else
klaŭzo), tiam la sama kalkulo estas farita, krom kun la height
kaj width
variabloj interŝanĝis ❷.
Iam
width
kaj height
enhavi la novan bildon dimensioj, pasi ilin al la resize()
telefono kaj stoki la reiris Image
objekto en im
❸.Paŝo 4: Aldoni la Logo kaj Savi la Ŝanĝoj
Ĉu aŭ ne la bildo regrandigo, la logo devus ankoraŭ esti batitaj al la fundo-dekstra angulo. Kie ĝuste la emblemo devus esti almetita dependas ambaŭ la grandeco de la bildo kaj la grandeco de la logo. Figuro 17-12 montras kiel kalkuli la interglui pozicio. Maldekstre koordinato por kie algluota la logoo estos la bildo larĝeco minus la logoo larĝo; la supro koordinato por kie almeti la logoo estos la bildo alteco minus la logoo alteco.
Figuro 17-12. Maldekstre
kaj supro koordinatoj por meti la logo en la malsupre-dekstra angulo
devus esti la bildo larĝeco / alteco minus la logoo larĝo / alto.
Post via kodo almetas la logoo en la bildo, ĝi devus savi modifitan
Image
objekto. Aldonu la jenan al via programo:#! python3 # ResizeAndAddLogo.py - Resizes ĉiuj bildoj en aktuala labordosierujon konveni # En 300x300 kvarangula aldonas catlogo.png al la suba-dekstra angulo. import os de PIL importado Bildo --snip-- # Kontroli se bildo devas esti regrandigo. --snip-- # Aldonu la logoo. ❶ print ( 'Aldono logo al% s ...'% (dosiernomo)) ❷ im.paste (logoIm, (larĝeco - logoWidth, alteco - logoHeight), logoIm) # Konservu ŝanĝojn. ❸ im.save (os.path.join ( 'withLogo', dosiernomo))
La nova kodo presas mesaĝon rakontanta la uzanto ke la emblemo estas aldonita ❶, almetas
logoIm
sur im
la kalkulita koordinatoj ❷ kaj savas la ŝanĝoj al dosiernomo en la withLogo dosierujo ❸. Kiam vi kuros ĉi programo kun la zophie.png dosieron kiel la sola bildo en la laboranta dosierujo, la eligo aspektos tiel ĉi:Regrandigi zophie.png ... Aldonante logo zophie.png ...
La bildo zophie.png estos ŝanĝita al 225 × 300 pixeles bildon kiu similas Figuro 17-13 . Memoru ke la
paste()
metodo ne almeti la travidebleco rastrumeroj se vi ne pasas la logoIm
por tria argumento ankaŭ. Tiu programo povas aŭtomate regrandigi kaj "logo-ify" centoj de bildoj en nur kelkaj minutoj.
Figuro 17-13. La bildo zophie.png regrandigo kaj la logoo aldonitaj (maldekstra). Se vi forgesos la tria argumento, la travideblajn punktoj en la logoo estos kopiita kiel solida blanka rastrumeroj (dekstra).
Ideoj por Similaj Programoj
Povi komponigita bildoj aŭ redakti bildo grandecoj en aro povas esti utila en multaj aplikoj. Vi povus skribi similajn programojn por fari la sekvajn:
- Aldoni tekston aŭ retejo URL por bildoj.
- Aldoni timestamps al bildoj.
- Kopii aŭ movi bildojn en malsamaj dosierujoj bazita sur iliaj grandecoj.
- Aldonu plejparte travidebla filigrano al bildo por ke aliaj ne kopiante ĝin.
Desegnado sur Bildoj
Se vi bezonas desegni liniojn, ortanguloj, cirkloj, aŭ aliaj simplaj formoj sur bildo, uzi Pillow la
ImageDraw
modulo. Eniri la sekva en la interaga konko: >>> De PIL importado Bildo, ImageDraw >>> im = Image.new ( 'RGBA', (200, 200), 'blanka') >>> remizo = ImageDraw.Draw (im)
Unue ni importi
Image
kaj ImageDraw
. Tiam ni kreos novan bildon, en tiu kazo, 200 × 200 blanka bildo, kaj stoki la Image
objekto en im
. Ni pasas la Image
celon por la ImageDraw.Draw()
funkcio ricevi ImageDraw
objekton. Ĉi objekto havas plurajn metodojn por desegni formojn kaj tekston sur la Image
objekto. Stoki la ImageDraw
objekto en variablo kiel draw
do vi povas uzi ĝin facile en la sekva ekzemplo.desegno Shapes
La jenaj ImageDraw metodoj desegni diversajn specojn de formoj sur la bildo. La
fill
kaj outline
parametroj por tiuj metodoj estas laŭvola kaj default al blanka se lasita nespecifita.punktoj
La metodo tiras individuajn rastrumeroj. La argumento reprezentas listo de la punktoj vi volas desegni. La listo povas esti listo de x- kaj y-koordinato opoj, ekzemple , aŭ de x- kaj y-koordinatoj sen opoj, ekzemple . La argumento estas la koloro de la punktoj kaj estas ĉu RGBA opo aŭ ŝnuro de koloro, ekz . La argumento estas laŭvola.
point(
xy, fill
)
xy
[(x, y), (x, y), ...]
[x1, y1, x2, y2, ...]
fill
'red'
fill
linioj
La metodo desegnas linion aŭ serio de linioj. Estas aŭ liston de opoj, ekzemple , aŭ de entjeroj, ekzemple . Ĉiu punkto estas unu el la konektanta punktojn sur la
line(
xy, fill, width
)
xy
[(x, y), (x, y), ...]
[x1, y1, x2, y2, ...]
linioj vi desegnante. La nedeviga fill
argumento estas la koloro de la linioj, kiel RGBA opo aŭ koloro nomon. La nedeviga width
argumento estas la larĝo de la linioj kaj defaŭltoj al 1 se lasita nespecifita.rektangulojn
La metodo tiras rektangulon. La argumento estas skatolo opo de formo . La kaj valoroj specifi la x- kaj y-koordinatoj de la supra-maldekstra angulo de la rektangulo, dum kaj specifi la suba-dekstra angulo. La nedeviga argumento estas la koloro kiu plenigos la internon de la ortangulo. La nedeviga argumento estas la koloro de la rektangulo de konturo.
rectangle(
xy, fill, outline
)
xy
(
left, top, right, bottom
)
left
top
right
bottom
fill
outline
elipsoj
La metodo tiras elipso. Se la larĝeco kaj alteco de la elipso estas identaj, tiu metodo eltiros cirklo. La argumento estas skatolo opo ( , , , ) kiu reprezentas skatolo kiu precize enhavas la elipso. La nedeviga argumento estas la koloro de la interno de la elipso kaj la laŭvola argumento estas la koloro de la elipso la konturo.
ellipse(
xy, fill, outline
)
xy
left
top
right
bottom
fill
outline
plurlateroj
La metodo tiras arbitran plurlatero. La argumento estas listo de opoj, ekzemple , aŭ tutaj, kiel , reprezentante la konektanta punktojn de la plurlatero la flankoj. La lasta paro de koordinatoj estos aŭtomate ligita al la unua paro. La nedeviga argumento estas la koloro de la interno de la plurlatero kaj la laŭvola argumento estas la koloro de la plurlatero la konturo.
polygon(
xy, fill, outline
)
xy
[(x, y), (x, y), ...]
[x1, y1, x2, y2, ...]
fill
outline
desegnante Ekzemplo
Eniri la sekva en la interaga konko:
>>> De PIL importado Bildo, ImageDraw >>> im = Image.new ( 'RGBA', (200, 200), 'blanka') >>> remizo = ImageDraw.Draw (im) ❶ >>> draw.line ([(0, 0), (199, 0), (199, 199), (0, 199), (0, 0)], plenigu = 'nigraj') ❷ >>> draw.rectangle ((20, 30, 60, 60), plenigi = 'blua') ❸ >>> draw.ellipse ((120, 30, 160, 60), plenigi = 'ruĝa') ❹ >>> draw.polygon (((57, 87 ), (79, 62), (94, 85), (120, 90), (103, 113)), plenigi = 'bruna') ❺ >>> por i en gamo (100, 200, 10): remizo .line ([(i, 0), (200, i - 100)], plenigu = 'verda') >>> Im.save ( 'drawing.png')
Post fari
Image
celon por 200 × 200 blanka bildo, pasante ĝin al ImageDraw.Draw()
akiri ImageDraw
celon, kaj stokante la ImageDraw
objekto draw
, vi povas voki desegno metodoj sur draw
. Tie ni faras maldikajn nigrekonturon
ĉe la randoj de la bildo ❶, blua rektangulo kun ĝia supro-maldekstra
angulo ĉe (20, 30) kaj malsupro-dekstra angulo ĉe (60, 60) ❷, ruĝa
elipso difinita de skatolo de (120, 30) al (160, 60) ❸, bruna plurlatero
kun kvin punktoj ❹ kaj mastro de verdaj linioj desegnitaj kun for
buklo ❺. La rezultanta drawing.png dosiero aspektos kiel Figuro 17-14 .
Figuro 17-14. La rezultanta drawing.png bildo
Estas pluraj aliaj formo-desegno metodoj por
ImageDraw
objektoj. La plena dokumentado estas havebla ĉe http://pillow.readthedocs.org/en/latest/reference/ImageDraw.html .desegnante Teksto
La
ImageDraw
objekto havas ankaŭ text()
metodo por desegni teksto sur bildo. La text()
metodo prenas kvar argumentojn: xy
, text
, fill
, kaj font
.- La
xy
argumento estas du-entjera opo preciziganta la supra-maldekstra angulo de la tekstujo. - La
text
argumento estas la ŝnuro de teksto vi volas skribi. - La nedeviga
fill
argumento estas la koloro de la teksto. - La nedeviga
font
argumento estasImageFont
objekto, uzata por agordi la tipon-vizaĝo kaj grandecon de la teksto. Tio estas priskribita en pli detalo en la venonta sekcio.
Ĉar ĝi estas ofte malfacile scii anticipe kion grandeco blokon de teksto estos en donita tiparo, la
ImageDraw
modulo ankaŭ proponas textsize()
metodon. Lia unua argumento estas la ĉeno de teksto vi volas mezuri, kaj lia dua argumento estas laŭvola ImageFont
objekto. La textsize()
metodo tiam reveni du-entjera opo de la larĝeco kaj alteco kiu la teksto en la donitatiparo estus se ĝi estis skribita sur la bildo. Vi povas uzi tiun larĝeco kaj alteco por helpi vin kalkuli ĝuste kie vi volas meti la tekston sur via bildo.
La unuaj tri argumentoj por
text()
estas simpla. Antaŭ ni uzas text()
tiri teksto sur bildo, ni rigardu la laŭvola kvara argumento, la ImageFont
objekto.
Ambaŭ
text()
kaj textsize()
preni laŭvolan ImageFont
celon kiel ilia fina argumentoj. Krei unu el ĉi tiuj celoj, unue kuri la jenaj:>>> De PIL importado ImageFont
Nun ke vi jam importis Pillow la
ImageFont
modulo, vi povas nomi la ImageFont.truetype()
funkcion, kiu prenas du argumentojn. La unua argumento estas ĉeno por la tiparo estas TTF-dosieron -tio cxi estas la fakta tiparo dosieron kiu vivas sur via fiksita disko. A TrueType dosiero havas la TTF dosiersufikso kaj povas kutime esti trovita en la sekvanta dosierujoj:- Sur Vindozo: C: \ Windows \ Fonts
- Sur OS X: / Library / Fonts kaj / System / Library / Fonts
- Sur Linukso: / usr / share / fonts / TrueType
Vi
ne vere bezonas eniri tiujn vojojn kiel parto de la TrueType dosiero
ŝnuro ĉar Pitono scias aŭtomate serĉi tiparojn en tiuj dosierujoj. Sed Python montros eraro se ĝi estas nekapabla trovi la tiparon vi specifitaj.
La dua argumento al
ImageFont.truetype()
estas entjero ĉar la tiparo en punktoj (prefere ol, ekzemple, pikseloj). Memoru ke Pillow kreas PNG bildoj kiuj estas 72 rastrumeroj por colo defaŭlte, kaj punkto estas 1/72 de colo.
Eniri la sekva en la interaga ŝelo, anstataŭante
FONT_FOLDER
la aktuala dosierujo nomi vian mastruman sistemon uzas:>>> De PIL importado Bildo, ImageDraw, ImageFont >>> import os ❶ >>> im = Image.new ( 'RGBA', (200, 200), 'blanka') ❷ >>> remizo = ImageDraw.Draw ( im) ❸ >>> draw.text ((20, 150), "Saluton", plenigu = 'purpura') >>> fontsFolder = 'FONT_FOLDER' # ekz 'Biblioteko / Tiparoj' ❹ >>> arialFont = ImageFont.truetype (os.path.join (fontsFolder: arial.ttf '), 32) ❺ >>> draw.text ((100, 150), "Howdy", plenigu =' griza ', tiparo = arialFont) >>> im .save ( 'text.png')
Post importanta
Image
, ImageDraw
, ImageFont
, kaj os
, ni faru Image
objekto por nova 200 × 200 blanka bildo ❶ kaj fari ImageDraw
celon de la Image
objekto ❷. Ni uzas text()
tiri Saluton ĉe (20, 150) purpura ❸. Ni ne pasis la laŭvola kvara argumento en tiu text()
alvoko, tiel la tipografía kaj grandeco de ĉi tiu teksto ne estas personecigita.
Fiksi tipografía kaj grandeco, ni unue gardi la dosierujo nomon (kiel / Biblioteko / Tiparoj ) en
fontsFolder
. Tiam ni nomas ImageFont.truetype()
, preter la TTF -dosiero de la tiparo ni volas, sekvita per entjero tiparo ❹. Stoki la Font
objekto vi ricevas el ImageFont.truetype()
en variablo kiel arialFont
kaj tiam pasi la variablo al text()
la fina ŝlosilvorto argumento. La text()
alvokon ĉe ❺ tiras Howdy ĉe (100, 150) en griza en 32-punkta Arial.
La rezultanta text.png dosiero aspektos kiel Figuro 17-15 .
Figuro 17-15. La rezultanta text.png bildo
resumo
Bildoj
konsistas el kolekto de rastrumeroj, kaj ĉiu pixel havas RGBA valoro
por lia koloro kaj lia direccionable per x- kaj y-koordinatoj. Du komunajn bildo formatoj JPEG kaj PNG. La
pillow
modulo povas pritrakti ambaŭ bildo formatojn kaj aliaj.
Kiam bildo estas ŝarĝita enen
Image
objekto, ĝia larĝo kaj alto dimensioj estas stokitaj kiel du-entjera opo en la size
atributo. Celoj de la Image
datumtipo ankaŭ havas metodojn por komuna bildo manipuladoj: crop()
, copy()
, paste()
, resize()
, rotate()
, kaj transpose()
. Savi la Image
objekto al bildo dosiero, nomu la save()
metodo.
Se vi volas vian programon por desegni formojn sur bildon, uzu
ImageDraw
metodojn por desegni punktojn, linioj, rektanguloj, elipsoj, kaj plurlateroj. La modulo ankaŭ provizas metodojn por desegni teksto en tipografía kaj tiparo de via elekto.
Kvankam
progresinta (kaj multekosta) aplikoj kiel Photoshop provizas aŭtomata
batch prilaborado karakterizaĵoj, vi povas uzi Python skriptoj fari
multaj de la samaj modifoj senpage. En la antaŭaj ĉapitroj, vi skribis Python programoj trakti tekston dosierojn, kalkultabelojn, PDFs kaj aliaj formatoj. Kun la
pillow
modulo, vi etendis viajn programado potencojn procesante bildoj tiel!praktiko Demandoj
Q:
|
1. Kio estas RGBA valoron?
|
Q:
|
2. Kiel povas vin akiras la RGBA valoro de
'CornflowerBlue' de la Pillow modulo? |
Q:
|
3. Kio estas skatolo opo?
|
Q:
|
4. Kio funkcio redonas
Image celon por, ni diru, bildo dosiero nomita zophie.png ? |
Q:
|
5. Kiel vi povas eltrovi la larĝeco kaj alteco de
Image objekto bildo? |
Q:
|
6. Kio metodo estus vi nomas akiri
Image celon por 100 × 100 bildo, ekskludante la malsupra maldekstra kvarono de ĝi? |
Q:
|
7. Post fari ŝanĝojn al
Image objekto, kiel povis vi konservos kiel bildo dosieron? |
Q:
|
8. Kio modulo enhavas Pillow la formo-desegnado kodo?
|
Q:
|
9.
Image objektoj ne havas desegnon metodoj. Kia objekto faras? Kiel vi akiras tian celon? |
praktiko Projektoj
Por praktiko, skribi programojn kiuj faras la sekvan.
Etendante kaj Fiksante la Ĉapitro Projekto Programoj
La resizeAndAddLogo.py programo en tiu ĉapitro laboras kun PNG kaj JPEG dosierojn, sed Pillow subtenas multaj pli formatoj ol nur tiuj du. Etendi resizeAndAddLogo.py procesi GIF kaj BMP bildoj ankaŭ.
Alia malgranda afero estas ke la programo modifas PNG kaj JPEG dosierojn nur se ilia dosieraj sufiksoj estas en minuskla. Ekzemple, ĝi procesos zophie.png sed ne zophie.PNG . Ŝanĝi la kodon por ke la dosiersufikso ĉeko estas kazo sensenta.
Figuro 17-16. Kiam la bildo estas ne multe pli granda ol la logoo, la rezultoj aspektas malbela.
Fine,
la logoo aldonita al la malsupra-dekstra angulo estas intencita esti
nur malgranda marko, sed se la bildo estas proksimume la sama grandeco
kiel la emblemo mem, la rezulto aspektos kiel Figuro 17-16 . Modifi resizeAndAddLogo.py tiel ke la bildo devas esti almenaŭ dufoje la larĝo kaj alto de la logo bildo antaŭ la emblemo estas batitaj. Aliaj saĝaj, ĝi devus salti aldonante la logoo.
Identiganta Foto Dosierujoj sur la Hard Drive
Mi
havas malbonan kutimon transfiriendo dosierojn el mia cifereca fotilo
al portempa dosierujoj ie sur la durdisko kaj poste forgesas pri tiuj
dosierujoj. Estus agrable skribi programon kiu povis skani la tuta malmola disko kaj trovi tiujn sobrantes "foto dosierujoj."
Skribi programon kiu iras tra ĉiu dosierujo en via malmola disko kaj trovas potencialo foto dosierujoj. Kompreneble, unue vi devos difini kion vi konsiderus "foto dosierujo" esti; diru ke ĝi estas ajna dosierujo kie pli ol duono de la dosieroj estas fotoj. Kaj kiel vi difinas kion dosieroj estas fotoj?
Unue, foto dosiero devas havi la dosiersufikso Png aŭ .jpg . Ankaŭ, fotoj estas grandaj bildoj; foton dosiero larĝo kaj alteco devas ambaŭ esti pli granda ol 500 pikseloj. Tio estas oni vetas sekura, ĉar plej diĝita fotilo fotoj estas plurmil rastrumeroj larĝa kaj alteco.
Kiel aludo, jen fluanta skeleto de kio tiu programo povus aspekti:
#! python3 # Import moduloj kaj skribi komentojn priskribi tiun programon. por foldername, subdosierujojn, dosiernomoj en os.walk ( 'C: \\'): numPhotoFiles = 0 numNonPhotoFiles = 0 por dosiernomo en dosiernomoj: # Kontroli se dosiersufikso ne .png aŭ .jpg. se TODO: numNonPhotoFiles + = 1 daŭrigi # skip to sekva dosiernomo # Malferma bildo dosieron per Pillow. # Kontroli se larĝa & alteco estas pli grandaj ol 500. se TODO: # Bildo estas sufiĉe granda por konsideri foton. numPhotoFiles + = 1 alie: # Bildo estas tro malgranda por esti foto. numNonPhotoFiles + = 1 # Se pli ol duono de dosieroj estis fotoj, # Presi la absolutan padon de la dosierujo. se TODO: print (TODO)
Kiam la programo kuras, gxi devus presi la absolutan padon de iu foto dosierujoj por la ekrano.
Kutimo Seating Kartoj
Ĉapitro 13 inkludis praktiko projekto krei kutimo invitoj el listo de gastoj en teksto dosiero. Kiel plia projekto, uzi la
pillow
modulon por krei bildojn por kutimo sidigado kartoj por viaj gastoj. Por ĉiu el la gastoj listigitaj en la guests.txt dosiero de la rimedoj je http://nostarch.com/automatestuff/ , generi bildon dosieron kun la gasto nomo kaj iuj floraj dekoracio. Publika havaĵo floro bildo estas havebla en la rimedoj je http://nostarch.com/automatestuff/ .
Certigi
ke ĉiu sidigado karto estas la sama grandeco, aldoni nigran rektangulon
sur la randoj de la invito bildon tiel ke kiam la bildo estas presita
el, estos gvidlinio por kortego. La PNG dosieroj Pillow
produktas havas inklinon al 72 rastrumeroj por colo, tiel kiel 4 × 5
coloj karto postulus 288 × 360 pixeles bildo.
Nenhum comentário:
Postar um comentário