Devils666 Posted December 30, 2009 Author Report Share Posted December 30, 2009 tikpat labi, tad kāda jēga tu vinu izmanto? Quote Link to comment Share on other sites More sharing options...
2easy Posted December 30, 2009 Report Share Posted December 30, 2009 1) atrodi garāko malu (horizontāla vai vertikāla bilde) sry, par pamatu ir jāņem nevis garākā mala, bet gan tā mala, kura proporcionāli visvairāk samazinās (tad arī otra mala garantēti iekļausies jaunajās dimensijās, saglabājot sākotnējo platuma:augstuma attiecību) piemērs/skaidrojums algoritmam: pieņemsim, ka bildei ir jāiekļaujas dimensijās 200x100 1) ja par pamatu ņem garāko malu, tad, resaizojot bildi ar dimensijām a) 300x100, iegūst 200x67 // ok, tas der (rezultāts iegūts, nofiksējot platumu uz 200 un pārrēķinot augstumu) b) 300x200, iegūst 200x133 // fail, jo augstums ir lielāks par 100 (rezultāts iegūts, nofiksējot platumu uz 200 un pārrēķinot augstumu) 2) ja par pamatu ņem to malu, kas proporcionāli visvairāk samazinās, tad, resaizojot bildi ar dimensijām a) 300x100, iegūst 200x67 // ok, tas der (rezultāts iegūts, nofiksējot platumu uz 200 un pārrēķinot augstumu) b) 300x200, iegūst 150x100 // ok, tas der (rezultāts iegūts, nofiksējot augstumu uz 100 un pārrēķinot platumu) working example... // image type (most common image types only) // $sP - image path function imTy($sP) { list(, , $iTy) = getimagesize($sP); switch ($iTy) { case IMAGETYPE_GIF: return 'gif'; case IMAGETYPE_JPEG: return 'jpg'; case IMAGETYPE_PNG: return 'png'; case IMAGETYPE_BMP: return 'bmp'; } } // image resize // $h - source bildes handle (resource handle) // $iNewW, $iNewH - jaunās/ierobežojošās dimensijas (width,height). norādot abas, izmantota tiks tikai viena - tai malai, kura proporcionāli visvairāk samazinās // return - jaunās/resaizotās bildes handle vai tā pati handle, ja resize nenotika (kad jaunā dimensija ir lielāka par pašreizējo/oriģinālo) function imResz($h, $iNewW = 0, $iNewH = 0) { // pašreizējās dimensijas $iW = imagesx($h); $iH = imagesy($h); // ja ir dotas abas jaunās dimensijas, tad atstāj tikai vienu (jo ir jāsaglabā sākotnējā malu attiecība w:h) // lai abas pašreizējās dimensijas pēc resaizošanas ietilptu jaunajās dimensijās, par pamatu ir jāņem tā dimensija, kura proporcionāli visvairāk samazinās (otru malu vēlāk pārrēķina) if ($iNewW && $iNewH) if ($iNewW / $iW < $iNewH / $iH) $iNewH = 0; else $iNewW = 0; if ($iNewW >= $iW || $iNewH >= $iH) return $h; // tā kā šī resize funkcija nepalielina bildi, bet tikai samazina, tad var iet mājās :D // tgd arī pārrēķina to otro malu. piemēram, ja jaunais platums ir 2x mazāks, tad arī jauno augstumu vajag 2x mazāku if ($iNewW) $iNewH = round($iH * $iNewW / $iW); else $iNewW = round($iW * $iNewH / $iH); $hNew = imagecreatetruecolor($iNewW, $iNewH); imagecopyresampled($hNew, $h, 0, 0, 0, 0, $iNewW, $iNewH, $iW, $iH); return $hNew; } // image copy (ar iebūvētu resize) // $sSrcP, $sDstP - source un destination path // $iNewW, $iNewH - jaunās dimensijas for imResz() function imCp($sSrcP, $sDstP, $iNewW = 0, $iNewH = 0) { $sTy = imTy($sSrcP); switch ($sTy) { case 'gif': $h = imagecreatefromgif($sSrcP); break; case 'jpg': $h = imagecreatefromjpeg($sSrcP); break; case 'png': $h = imagecreatefrompng($sSrcP); } $hNew = imResz($h, $iNewW, $iNewH); if ($hNew == $h) {copy($sSrcP, $sDstP); return;} switch ($sTy) { case 'gif': imagegif($hNew, $sDstP); break; case 'jpg': imagejpeg($hNew, $sDstP, imagesx($hNew) <= 200 && imagesy($hNew) <= 200 ? 100 : 90); break; // mazākām jpg bildēm lielāka kvalitāte 100% (php jpg kvalitāte sucks, salīdzinot ar photoshop), lielākām bildēm tikai 90% (lai nav pārāk liels file size) case 'png': imagepng($hNew, $sDstP); } } // testam lokāli izmantoju googles logo http://google.com/intl/en_com/images/logo_plain.png // ar to bildi, protams, viss ir kārtībā, taču in production environment tamlīdzīgai pārbaudei normāli būtu jābūt if (!in_array(imTy('google-logo.png'), array('gif', 'jpg', 'png'))) echo 'Bildei ir jābūt gif/jpg/png!'; else imCp('google-logo.png', 'google-logo2.png', 200, 100); Quote Link to comment Share on other sites More sharing options...
Pentiums Posted December 31, 2009 Report Share Posted December 31, 2009 tikpat labi, tad kāda jēga tu vinu izmanto? Es viņu izmantoju priekš tā kā viņa ir domāta "Bilžu samazināšanai!" :) Quote Link to comment Share on other sites More sharing options...
Devils666 Posted December 31, 2009 Author Report Share Posted December 31, 2009 nu jā, es viņu tam ari izmantoju, uploadojot failu, viņs samazina bildi... :) un, tgd ar bilžu samazināšanu viss ir ok... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.