[ username1987 @ 12.04.2011. 17:45 ] @
Pozdrav. Uradio sam neki kod za resize i skripta radi kako sam i predvidio.Skripta resize-uje na 200px x 200 px. I sve je okej kada je slika koju uploadujem približne visine i širine.
No veliki je problem kada npr. uploadujem sliku koja je 400 px širine i 100 px visine.Eh pošto logički predpostavljam da je nemoguče uraditi resize a da se ne primjeti sa ovakvim dimenzijama. Zamolio bih vas da mi date neke alternative.
Cilj mi je da napravim skriptu za vijesti, na početnoj stranici će prikazivati malu sliku od npr 200 x 200 px, dok bi na stranici kada se klikne "Čitaj sve" bila veća slika.

U glavi imam 3 ideje pa bih molio od vas iskusnijih da mi date koji savjet.

1.Da ograničim širinu i viisinu slika koliko hoću tj. da mi maksimalna sirina i visina slike bude npr 250 x 200 px.
2.Da radim resize i da velike slike omogućim ali da ograničim da visina može biti veća od širine samo za 100 px ili obrnuto.(Resize bi bio koliko toliko prihvatljiv).
3. Da omogućim upload slika i da radim crop djela slike na npr 200x200px..

Evo i kod koji koristim.
Code:
if(isset($_POST['Submit']))
{
$current_image=$_FILES['image']['name'];
$extension = substr(strrchr($current_image, '.'), 1);
if (($extension!= "jpg") && ($extension != "jpeg"))  
{
die('Unknown extension');
}
$time = date("fYhis");
$new_image = $time . "." . $extension;
$destination="uploads/".$new_image;


if(move_uploaded_file($_FILES['image']['tmp_name'], $destination)) {
    echo "The file ".  basename( $_FILES['image']['name']). 
    " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
}


//resize//
$create = imagecreatefromjpeg($destination);
$currwidth = imagesx($create); 
$currheight = imagesy($create);
$ccreate = ImageCreateTrueColor(50,50);

imagecopyresampled($ccreate, $create, 0, 0, 0, 0, 50, 50, 
$currwidth, $currheight); 
imagejpeg($ccreate, "thumbs/".$new_image);
imagedestroy($ccreate); 
imagedestroy($create); 

}else{
?>
<form method="post" enctype="multipart/form-data" action="cc.php">
<input type="file" name="image" ><br>
<input type="submit" name="Submit" value="submit">
</form>
<?php
}


Zamolio bih komentare i za malu pomoć da vidim kako bi ovo mogao uraditi na kvalitetan način.
[ Br@nkoR @ 13.04.2011. 12:55 ] @
Možeš i npr. procentualno da smanjuješ slike, pošto kažeš da dimenzije nisu ite npr.
Code:

$maxWidth = 200;
$maxHeight = 200;

$ratioW = $maxWidth / $currwidth;
$ratioH = $maxHeight / $currheight;

$ratio = ($ratioW < $ratioH) ? $ratioW : $ratioH;

$newWidth = intval($currwidth * $ratio);
$newHeight = intval($currheight * $ratio);
[ username1987 @ 13.04.2011. 16:24 ] @
Ali i po ovom kodu ce mi raditi resize i ukoliko širina i visina budu puno odskakala jedna od druge opet se neće moći uraditi kvalitetan resize. Još neko ideja ?
Jel se i ostale skripte za vijesti rade ovako i imaju slične probleme?
[ Br@nkoR @ 13.04.2011. 17:29 ] @
Jedino što mi još pada na pamet je da sa ovim što sam napisao u prethodnoj poruci ukombinuješ i crop.
[ taksistaZR @ 13.04.2011. 18:03 ] @
Code:

$maxx = 200;
$maxy = 200;

if ( $ogrx / $maxx > $ogry / $maxy ) 

    $ngrx = $maxx;
    $ngry = ( $ogry * $maxx ) / $ogrx;
} else { 
    $ngry = $maxy;
    $ngrx = ( $ogrx * $maxy ) / $ogry;
}


Mozes da dodas jos proveru da li je slika veca od $maxx i $maxy pre nego je smanjis.
[ japan @ 13.04.2011. 18:18 ] @
Još jedna mogućnost je da "paduješ" sliku, tj da sliku smanjiš proporcionalno, tako da ni širina ni visina ne budu veće od tih zadatih 200px, i da to onda nalepiš na beli (ili kakav god) kvadrat dimenzija 200 x 200
[ username1987 @ 13.04.2011. 21:45 ] @
Hajde da polako remiziramo. Nikako ne mogu postići vrhunski resize zbog rezulocije i razlike u visini/širini.Koliko sam skontao ono što mi je najlogičnije je da dozvolim upload slika dimenzija koje ja hocu?
Nekako i u početku mi se tako činilo. I ostali koji su se pravili skripte za vijesti su se susretali sa ovim problem ?
Molim još nekog iskusnijeg samo da javi i potrvrdi ovo. Hvala
[ Miroslav Ćurčić @ 13.04.2011. 22:00 ] @
Baš kako ti je Japan rekao.
Resize-uj sa paddingom gde treba, u boji pozadine, ili transparentnim ako baš hoćeš. A to što će neko da uploaduje sliku 100x600 ko mu je kriv, nek je sredi pre uploada. Bitno je da nisi razbio layout stranice takvim tornjem od slike.

Dozvoli upload svih formata, pa ga ti resize-uj na maksimalnu veličinu koja će ti trebati (za prikaz vesti u celosti) i takvu je snimi kod sebe na hosting, nemaš potrebe čuvati originale. Ostale thumb-ove praviš od ovog.
[ taksistaZR @ 14.04.2011. 11:31 ] @
1. Dozvoljavas upload svih dimenzija
2. Ako je slika veca od zadatih dimenzija smanjujes je
3. Bitno je da nova slika po sirini ili visini ne prelazi zadate dimenzije
4. Da bi slika bila dobra vodis se dimenzijom duze ose koju ogranicavas na max. duzinu i na osnovu nje dobijas proporcialnu kracu osu
5. Prikazujes sliku u div-u (po potrebi fiksnih dimenzija)

Nije bitno da li ces da padujes ili samo smanjis sliku na ovaj nacin ce ti prikaz biti dobro uniformisan.

Od slike 100 x 600 dobices sliku 33 x 200
Od slike 600 x 100 dobices sliku 200 x 33
[ japan @ 14.04.2011. 11:57 ] @
Pošto mi je pokretač teme tražio da mu napišem kod za smanjivanje sa padingom, evo na brzinu napisane f-je, bez provere tipa slike, mada bi ta provera lako mogla da se doda, pa da radi i za ostale tipove, ne samo za jpg.

A ne bi bilo loše i da se doda provera da li je slika manja od zadatih dimenzija, da se ne bi desilo da se slika povećava.


Code:

function paddedImage ($src_filename, $dest_filename, $dim, $bg_R, $bg_G, $bg_B, $quality) {

    $src = imagecreatefromjpeg($src_filename);

    $width = imagesx($src);
    $height = imagesy($src);

    $ratio_w = $dim / $width;
    $ratio_h = $dim / $height;

    $ratio = ($ratio_w < $ratio_h) ? $ratio_w : $ratio_h;

    $new_width = $width * $ratio;
    $new_height = $height * $ratio;

    $padd_x = ($dim - $new_width) / 2;
    $padd_y = ($dim - $new_height) / 2;

    $dest = imagecreatetruecolor($dim, $dim);
    $background_color = imagecolorallocate($dest, $bg_R, $bg_G, $bg_B);
    imagefilledrectangle($dest, 0, 0, $dim, $dim, $background_color);

    imagecopyresampled($dest, $src, $padd_x, $padd_y, 0, 0, $new_width, $new_height, $width, $height);

    if ($dest_filename) {
        imagejpeg($dest, $dest_filename, $quality);
    } else {
        header('Content-Type: image/jpeg');
        imagejpeg($dest, null, $quality);
    }

    imagedestroy($src);
    imagedestroy($dest);

}

$src_filename = 'test.jpg';
$dest_filename = 'test-padded.jpg';

paddedImage($src_filename, $dest_filename, 200, 128, 128, 128, 100); // čuva sliku
paddedImage($src_filename, null, 200, 128, 128, 128, 100); // štampa u browser



[Ovu poruku je menjao japan dana 14.04.2011. u 13:10 GMT+1]