Jump to content
php.lv forumi

Gatavu bilžu reseizošana....


Devils666

Recommended Posts

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);

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...