Ĉ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
Imageobjekto. - Buklo super la kordoj cxesis
os.listdir('.'). - Akiri la larĝeco kaj alteco de la bildo de la
sizeatributo. - 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
widthestas 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_SIZEvaloro dividita per la nuna larĝo. La nova heightvaloro estas tiu proporcio multiplikita de la aktuala heightvaloro. 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 widthvaloro estos simple metita SQUARE_FIT_SIZE.
Se
heightestas pli granda ol aŭ egala al la width(ambaŭ kazoj estas manipulitaj en la elseklaŭzo), tiam la sama kalkulo estas farita, krom kun la heightkaj widthvariabloj interŝanĝis ❷.
Iam
widthkaj heightenhavi la novan bildon dimensioj, pasi ilin al la resize()telefono kaj stoki la reiris Imageobjekto 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
Imageobjekto. 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
logoImsur imla 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 logoImpor 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
ImageDrawmodulo. 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
Imagekaj ImageDraw. Tiam ni kreos novan bildon, en tiu kazo, 200 × 200 blanka bildo, kaj stoki la Imageobjekto en im. Ni pasas la Imagecelon por la ImageDraw.Draw()funkcio ricevi ImageDrawobjekton. Ĉi objekto havas plurajn metodojn por desegni formojn kaj tekston sur la Imageobjekto. Stoki la ImageDrawobjekto en variablo kiel drawdo vi povas uzi ĝin facile en la sekva ekzemplo.desegno Shapes
La jenaj ImageDraw metodoj desegni diversajn specojn de formoj sur la bildo. La
fillkaj outlineparametroj 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'filllinioj
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 fillargumento estas la koloro de la linioj, kiel RGBA opo aŭ koloro nomon. La nedeviga widthargumento 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 )lefttoprightbottomfilloutlineelipsoj
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 )xylefttoprightbottomfilloutlineplurlateroj
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, ...]filloutlinedesegnante 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
Imagecelon por 200 × 200 blanka bildo, pasante ĝin al ImageDraw.Draw()akiri ImageDrawcelon, kaj stokante la ImageDrawobjekto 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 forbuklo ❺. 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
ImageDrawobjektoj. La plena dokumentado estas havebla ĉe http://pillow.readthedocs.org/en/latest/reference/ImageDraw.html .desegnante Teksto
La
ImageDrawobjekto havas ankaŭ text()metodo por desegni teksto sur bildo. La text()metodo prenas kvar argumentojn: xy, text, fill, kaj font.- La
xyargumento estas du-entjera opo preciziganta la supra-maldekstra angulo de la tekstujo. - La
textargumento estas la ŝnuro de teksto vi volas skribi. - La nedeviga
fillargumento estas la koloro de la teksto. - La nedeviga
fontargumento estasImageFontobjekto, 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
ImageDrawmodulo ankaŭ proponas textsize()metodon. Lia unua argumento estas la ĉeno de teksto vi volas mezuri, kaj lia dua argumento estas laŭvola ImageFontobjekto. 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 ImageFontobjekto.
Ambaŭ
text()kaj textsize()preni laŭvolan ImageFontcelon 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
ImageFontmodulo, 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_FOLDERla 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 Imageobjekto por nova 200 × 200 blanka bildo ❶ kaj fari ImageDrawcelon de la Imageobjekto ❷. 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 Fontobjekto vi ricevas el ImageFont.truetype()en variablo kiel arialFontkaj 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
pillowmodulo povas pritrakti ambaŭ bildo formatojn kaj aliaj.
Kiam bildo estas ŝarĝita enen
Imageobjekto, ĝia larĝo kaj alto dimensioj estas stokitaj kiel du-entjera opo en la sizeatributo. Celoj de la Imagedatumtipo ankaŭ havas metodojn por komuna bildo manipuladoj: crop(), copy(), paste(), resize(), rotate(), kaj transpose(). Savi la Imageobjekto al bildo dosiero, nomu la save()metodo.
Se vi volas vian programon por desegni formojn sur bildon, uzu
ImageDrawmetodojn 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
pillowmodulo, 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 Pillowmodulo? |
Q:
|
3. Kio estas skatolo opo?
|
Q:
|
4. Kio funkcio redonas
Imagecelon por, ni diru, bildo dosiero nomita zophie.png ? |
Q:
|
5. Kiel vi povas eltrovi la larĝeco kaj alteco de
Imageobjekto bildo? |
Q:
|
6. Kio metodo estus vi nomas akiri
Imagecelon por 100 × 100 bildo, ekskludante la malsupra maldekstra kvarono de ĝi? |
Q:
|
7. Post fari ŝanĝojn al
Imageobjekto, kiel povis vi konservos kiel bildo dosieron? |
Q:
|
8. Kio modulo enhavas Pillow la formo-desegnado kodo?
|
Q:
|
9.
Imageobjektoj 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
pillowmodulon 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