PHP, Batch
Nugan.
Šitento savu maģistrdarbu taisot būšu viskautko jaunu samācījies...
Prmkārt jau vajadzēja no diviem atšķirīgiem windows bitmap (BMP) failiem uztaisīt vienu. Nu kas tur liels, kā sacīt jāsaka, paņem paintā, izgriež to, kas jāizgriež un uzkrāmē tam, kam jāuzkrāmē. Bet ja tāda lieta jādara 50 reizes? Tad īsti negribās tā darīt un jāņem palīgā programmēšanas iemaņas. Tā kā vistuvākā ir PHP, tad, zinādams, ka ir tāda GD2 bibliotēka, ar kuru var bildes taisīt, lādēt, kopēt un viskocitu, tad papētīju to, bet, par neražu, PHP ņemas tikai ar portable network graphic (PNG) un Joint Photographic Experts Group (JPG, JPEG). Tā kā man tās bildītes vajadzīgas as-is (tieši tādas, kādas viņas ir, tad arī izvēlējos ņemties ar PNG formātu, pie tam ar 0 kompresijas līmeni - neradot attēliem kvalitātes zudumus.
Cik sapratu, mainās faila struktūra, bet tas PNG, kas uz monitora, ir tieši tāds pats, kāds BMP uz monitora.
Tātad - jauna problēma. Programma tā kā būtu, bet visi 50 attēli ir BMP, bet viņus vajag kā PNG...
Atrodu internetā maziņu komandrindas programmiņu -
bmp2png.exe. Šī programma strādā labi, vienīgi - nākošā problēma - atkal katrs BMP fails atsevišķi jākonvertē un nav iespējas nokonvertēt visus failus uzreiz.
Atceros par Batch failiem, failiem, kuri beidzas ar .bat paplašinājumu. Tajos var rakstīt dažādas komandas un ar to palaist citas komandas, kas ir iekš windows vai attiecīgi norādītās programmas. Bet vai tajos var uztaisīt ciklu (loop)? Un izrādās, ka var.
Sintakse ir šāda -
FOR /R [[disks:]ceļš_uz_direktoriju] %%parametrs IN (sets) DO komanda
Ja grib visus .bak failus izdzēst direktorijā C:\temp, tad jāraksta:
FOR /R C:\temp\ %%G IN (*.bak) DO del %%G
/R nozīmē - rekurss pa subfolderi
sets - failu izlase, var lietot arī *.* ja grib visus failus apstrādāt ar "komandu"
par %%parametru īsti nemāku teikt, kāpēc tieši dzēšanas vietā viņu par %%G nosauc. Varbūt, ja ir vairāki parametri, tad vienalga, kāds burts tur ir, vien viņš būs kā skaitītājs, nez.
Mana .bat faila rindiņa bija sekojoša:
FOR /R C:\Apache\Apache2\htdocs\magbildes\ %%G in (*.bmp) DO BMP2PNG.exe -0 "%%G"
un ieguvu 50 png bildītes.
Tālāk man vajadzēja katrai no šīm 50 bildītēm ielīmēt vienas konstantās bildītes viducīti, ko panācu ar PHP. Izveidoju php failu ar ciklu, kurš, pateicoties failu nosaukumu linearitātei, nebija sarežģīts. Visu failu nosaukumi ir skaitļi no 64 līdz 192 ar soļa vērtību 2. Tātad cikls izskatās šāds -
#PHP sākums
for ($a=64; $a<=192; $a = $a+2)
{ #cikla sākums
#jāizveido nosaukums bildītēm -
$nos = $a.".png"; #Šis izveido nosaukumu tam 300x300px PNG failam, no kura tiks izgriezts viducītis.
$jauns = $a."___.png"; #Šis izveido nosaukumu tam 300x300px PNG failam, kurš būs gala bilde.
$konst = imageCreateFrompng("64.png") ; #Šis paņem konstanto bildi PHP atmiņā laikam.
$vidus = imagecreatefrompng($nos); #Šis paņem bildi atmiņā, no kuras tiks izgriezts viducītis.
imagecopymerge($konst, $vidus, 0, 100, 0, 100, 300, 100, 100); #Šitais dara līmēšanas darbu; paņem vidējos 100px no bildes, no kuras man vajag viducīti, visā bildes platumā un ielīmē konstantās bildes viducītī.
imagepng($imm,$jauns); #izveido bildīti kā failu ar jauno nosaukumu
imageDestroy($imm); #iznīcina bildīti no PHP atmiņas
} #cikla beigas
#PHP beigas
Tālāk - esmu ieguvis 50 jaunas bildītes... bet... visas ir PNG formātā, bet man tālākai šo bilžu pielietošanai viņas nepieciešamas BMP formātā. Izpalīdzēt mums var PNG2BMP programmiņa, kuru palaižu ar Batch failiņa (.bat) palīdzību līdzīgi, kā iepriekš konvertējot BMP bildītes uz PNG formātu. .bat fails satur atkal tikai vienu rindiņu, kas izpilda programmu ciklā ar visiem failiem.
FOR /R C:\Macibas\mo\FINAL\pecefektu_limenis\gr
afika2 %%G in (*.png) DO PNG2BMP.exe "%%G"
Atšķirības ir divas - ir cita direktorija un no PNG2BMP.exe ir pazudis "-0" parametrs, jo BMP faili ir nesakompresējami, tātad PNG tiks izveidots par BMP "as-is" - tāds, kāds viņš ir.
Neesmu iekāpis nekādos bildes kvalitātes zudumos, tā man šķiet.
Palaižot šo .bat failu, esmu ieguvis to, kas man bija vajadzīgs - 50 apstrādātus BMP failiņus.
Tas viss pateicoties mazāk par 20 rindiņām koda PHP un Batch valodā.
Varbūt kādam noder... vismaz daļiņa no šī visa.