[ Dejan Krstic @ 03.01.2004. 16:36 ] @
Imam direktorijum koji u sebi ima razne slike. Treba da napravim stranicu koja ce da izlista sve te slike ali ne cele nego npr 32x32pix. Da li zna neko jel moguce iz php-a uraditi to (pogledao sam Image functions ali tamo nema resize) ili treba da trazim neke f-je po netu?
[ Goran Rakić @ 03.01.2004. 17:41 ] @
imagecopyresized za GD biblioteku

Code:

/* 
* $location je abs. putanja do slike
* is_gd2() je funkcija koja proverava verziju GD biblioteke 
*/

$src_img=imagecreatefrompng($location);
$old_x=imageSX($src_img);
$old_y=imageSY($src_img);

$height=$old_y/($old_x/130);
if(is_gd2()==FALSE) 
{
   /* GD1.x */
   $dst_img=ImageCreate(130,$height);
   imagecopyresized($dst_img,$src_img,0,0,0,0,130,$height,$old_x,$old_y);
}
else 
{
   /* GD2.x */
   $dst_img=ImageCreateTrueColor(130,$height);
   imagecopyresampled($dst_img,$src_img,0,0,0,0,130,$height,$old_x,$old_y);
}

/* slika je sada dostupna u $dst_img GD objektu */
          
header("Content-type: image/png");
imagepng($dst_img);
imagedestroy($dst_img);

[ Dejan Krstic @ 03.01.2004. 18:17 ] @
Citat:
Goran Rakić:
Code:


header("Content-type: image/png");
imagepng($dst_img);
imagedestroy($dst_img);



To je ok ako hocu samo taj jedan thumbnail da prikazem i nista vise ali ta skripta treba da se izvrsi nad gomilom slika i da thumbnailove prikaze na html stranici....
[ NikolaVeber @ 03.01.2004. 19:02 ] @
treba da taj fajl pozoves na mestu svakog tumbnail-a. Znaci da imas php skriptu koja za svaki fajl u direktorijumu postavlja <img> tag, a src=slika.php?imgName=imeSlike, na primer, gde je slika.php fajl sa kodom koji je Goran napisao. Cini mi se da moras da ga stavis u poseban fajl, jer mora da zada headers pre bilo cega drugog.
[ Dejan Krstic @ 03.01.2004. 23:18 ] @
Da, jasno. A mora u poseban fajl jer nije moguce slati vise hedera.
[ bluesman @ 03.01.2004. 23:58 ] @
Ili koristiš ImageMagick koji je besplatan, pravi mnogo bolji kvalitet kada se resize-uje (mada za 32 x 32 i nije toliko važno jer se tu ionako ništa ne vidi) i lako se koristi.

Za gd, evo ti jedan kod koji lista sadržaj foldera i radi ono što tebi treba (ovo sam ja onomad nešto testirao, radi ali ne garantujem za svaki slučaj jer sam čisto probao):

thumb.php:
Code:

<?php
$jpegDir    = isset($folder)    ? $folder     : "";    // folder to copy
$destImg    = isset($dest_img)    ? $dest_img : "";    // destination image
$picMaxW    = isset($picMaxW)    ? $picMaxW    : 100;    // maximum width
$picMaxH    = isset($picMaxH)    ? $picMaxH    : 100;    // Maximum height

$jpeg        = $jpegDir .'/'. $img;
$destJpeg    = $jpegDir .'/'. $destImg;

if ($d=getimagesize($jpeg) ){
    $picW = $d[0];
    $picH = $d[1];

    $percentW = $picMaxW / $picW;
    $percentH = $picMaxH / $picH;

    $percent = ($percentW < $percentH) ? $percentW : $percentH;
    $sizeW = intval($picW * $percent);
    $sizeH = intval($picH * $percent);

    header('Content-type: image/jpeg');

    $src    = imagecreatefromjpeg($jpeg);
    $dst    = imagecreate($sizeW, $sizeH);
    $white = imagecolorallocate($dst,255,255,255);        // background color
    // imagefill ($dst,0,0,$white);
    // imagecopyresampled($dst,$src, 0, 0, 0, 0, $sizeW, $sizeH, $picW, $picH);
    imagecopyresized ($dst, $src, 0, 0, 0, 0, $sizeW, $sizeH, $picW, $picH);
//    imagejpeg($dst, $destJpeg);        // to create file on disk and replace old file
    imagejpeg($dst);
    imagedestroy($dst);
    imagedestroy($src);
    return true;
}
return false;
?>


Bolji kvalitet daje ...resampled... nego ...resized... ali je moraš da imaš noviju verziju GD (u vreme kada sam ja ovo testirao, na većini komercijalnih servera nije postojala, pretpostavljam da je sada ima)
Kao što vidiš, ako hoćeš da pišeš thumbnails u file, skloni komentar ispred linije
// imagejpeg($dst, $destJpeg); // to create file on disk and replace old file


example (računa se da su sve slike u podfolderu "images"):
Code:

<html>
<head>
<title>Thumbnail create test</title>
</head>

<body>
<?php
if($dir=opendir('images')){
    while($file=readdir($dir)){
        if('.'==$file || '..'==$file)    continue;
        if(is_dir('images/'.$file))        continue;
        echo "\r\n";
//        printf('<a href="images/%s"><img src="thumb.php?img=%s" border="0" alt="%s"></a>', $file, $file, $file);
        printf('<a href="images/%s"><img src="thumb.php?img=%s" border="0" alt="%s"></a>', $file, $file, $file);
    }
    closedir($dir);
}

?>
</body>
</html>

[ Dejan Krstic @ 04.01.2004. 22:34 ] @
Evo mog resenja za generisanje thumb-a.

Code:

<?php
// prvo definisem max velicinu thumb-a
define("thumb_size", 100);

// onda kazem da ucita sliku ciji je naziv primio preko url-a
$im = imagecreatefromjpeg("pics/".$_GET['image']);

// pa onda odredjujem koliko puta se slika treba smanjiti
$ratio = (imagesx($im) > imagesy($im)) ? imagesx($im) / thumb_size : imagesy($im) / thumb_size;

// kreiram novu sliku umanjenu za $ratio puta
$dst_img=imagecreatetruecolor($newx = imagesx($im) / $ratio, $newy = imagesy($im) / $ratio);

// resample stare u novu
imagecopyresampled($dst_img, $im, 0, 0, 0, 0, $newx, $newy, imagesx($im), imagesy($im));

// saljem heder
header("Content-type: image/jpeg");

// i najzad thumb
imagejpeg($dst_img);
?>


Jedino je problem sto malo dugo traje to. Izgleda cu ipak morati da se pozabavim kesiranjem.
[ Goran Rakić @ 05.01.2004. 00:42 ] @
zanimljivo je što na ovoj temi postoje 3 rešenja koja su gotovo indentična.
[ bluesman @ 05.01.2004. 01:07 ] @
Zanimljivo je koliko su neki osetljivi. :-)

Ja ne bih postovao kod da nije čovek postavio pitanje
Citat:

Imam direktorijum koji u sebi ima razne slike.


a koliko vidim toga u tvom kodu nema. No izvini ako sam te uvredio time što sam postovao svoj kod.

[Ovu poruku je menjao bluesman dana 05.01.2004. u 03:10 GMT]
[ stdlib.h @ 05.01.2004. 01:09 ] @
Dejane, jel postoji mogucnost da ovaj tvoj kod u postu iznad Goranovog pokupi sve slike iz pics foldera i generise vise thumbova na stranici sa linkom ka originalnoj fotki na svakom thumbu?

bluesmanov kod upravo to radi, medjutim, thumbovi koje generise od fotki se ne vide na stranici iz nekog razloga :( tvoj kod sljaka ok, ali vraca samo po jednu fotku koju pozoves sa ?image=fotka.format bez linka ka originalu i bez ikakve ideje u mojoj glavi kako da generisem i formatiram raspored vise thumbnailova na stranici :(

tnx!
[ bluesman @ 05.01.2004. 02:10 ] @
Ne znam zašto nebi radio... doduše ono je stari kod i nisam ga pipnuo odavno a ko zna šta sam radio dok sam testirao (vidiš commented linije... ). Da li si lepo uneo putanje (pročitaj komentare)... nije ni bitno, možda ti je važniji donji deo koda koji kupi slike iz foldera i poziva script koji generiše thumbnails.
[ bluesman @ 05.01.2004. 02:17 ] @
A pošto sam spominjao imagemagick, evo šta on može jednim potezom:

To convert a directory full of JPEG images to thumbnails, use:
mogrify -size 120x120 *.jpg -resize 120x120 +profile "*"

In this example, '-size 120x120' gives a hint to the JPEG decoder that the images are going to be downscaled to 120x120, allowing it to run faster by avoiding returning full-resolution images to ImageMagick for the subsequent resizing operation. The '-resize 120x120' specifies the desired dimensions of the output images. It will be scaled so its largest dimension is 120 pixels. The '+profile "*"' removes any ICM, EXIF, IPTC, or other profiles that might be present in the input and aren't needed in the thumbnails.

a pri tom možeš da ga "pozoveš" iz PHP preko>
system ('mogrify -size 120x120 *.jpg -resize 120x120 +profile "*"')
[ Dejan Krstic @ 05.01.2004. 13:44 ] @
@Goran Rakic

Ja sam na osnovu onog sto sam skapirao iz vasih kodova pokusao da napravim malo jednostavniji kod i to sam i uspeo (jos nisam naisao na bug). Znaci sva tri koda rade skoro isto samo sto sam ja pokusao to maksimalno da pojednostavim i skratim.

Izgleda da sam zaboravio na pocetak svog koda da dodam jednu liniju:

Code:

define("sujeta", false);



Citat:
stdlib.h:
Dejane, jel postoji mogucnost da ovaj tvoj kod u postu iznad Goranovog pokupi sve slike iz pics foldera i generise vise thumbova na stranici sa linkom ka originalnoj fotki na svakom thumbu?

bluesmanov kod upravo to radi, medjutim, thumbovi koje generise od fotki se ne vide na stranici iz nekog razloga :( tvoj kod sljaka ok, ali vraca samo po jednu fotku koju pozoves sa ?image=fotka.format bez linka ka originalu i bez ikakve ideje u mojoj glavi kako da generisem i formatiram raspored vise thumbnailova na stranici :(

tnx!


Moja aplikacija upravo to i radi samo sto sam ja postova samo onaj fajl koji vraca jpeg u zavisnosti od toga koje je ime fajla primio GET metodom. Evo sada i glavnog fajla koji moze da stavlja thumbove u proizvoljan broj kolona.

Code:

<?php define("kolone", 7); // ovde definisem koliko cu kolona ?> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<?php

$dir = "pics/"; // ovde kaze kako se zove direktorijum
$dh = opendir($dir); // trazim handler za taj direktorijum
$brojac = 0; // postavljam brojac kolone na nulu
?>

<body>
<table border="1" align="center">
  <tr>
<?php
while (($file = readdir($dh)) != false) // dok god nalazis fajlove u direktorijumu vrti se kroz sledeci blok

{
if (($file == ".") || ($file == "..")) continue; // ne treba komentar
$brojac++; // povecavam brojac
?>

    <td><a href="pera.php"><img src="image.php?image=<?php echo $file; ?>"></a></td>
<?php
if ($brojac == kolone) { echo "</tr><tr>"; $brojac = 0; } // ukoliko je brojac kolona stigao do odredjenog broja predji u sledeci red

}
?>
</table>
</body>
</html>


Naravno ovo se da uraditi mnogo lepse ali to mi je bilo samo za probu a i necu ovde da gnjavim sa smartyjem.
[ -zombie- @ 05.01.2004. 14:30 ] @
ok.. nema razloga za podizanje strasti.. sve je u redu..


// ..move along people.. nothing (smart) to see here.. :-P
[ Goran Rakić @ 05.01.2004. 17:54 ] @
ala me ubiste u pojam, a ja probao da se našalim. žao mi je ako sam nekog povredio komentarom.
[ bluesman @ 06.01.2004. 01:57 ] @
Pa, Gorane, obično ljudi kada se šale stave bar neki "hint" da je u pitanju šala, ono tvoje je zvučalo prilično "detinjasto", nisi nikoga povredio već si tu zvučao povređen pa sam pomislio da si hipersenzitivan :-)
[ Dejan Krstic @ 07.01.2004. 21:14 ] @
Imam sada jedan problem.

Kada mi browser izlista stranicu sa thumbovima sve bude ok ali kada kliknem na neki thumb i onda na Save As.... samo mogu da ga snimim kao bmp iako je browseru explicitno preko hedera receno da se radi o image/jpeg sadrzaju. Da li neko zna u cemu je problem?
[ Dejan Krstic @ 19.01.2004. 13:59 ] @
Mozda je trebalo malo bolje da objasnim o cemu se radi:

Direktorijum u kom se nalaze slike je skroz zasticen i nije mu moguce prici direktno. Znaci ima .htaccess fajl u kom pise "Deny From All". Jedini nacin da se slika prikaze na ekranu je da je prosledi php.

Prikazivanje ide otprilike ovako:

U fajlu view_pic.php se nalazi ovakav tag: <img src="show_pic.php?name=slika.jpg">

Kada se pozove show_pic.php on uradi nesto ovako:

Code:

$slika = file_get_contents($_GET['name']);
header("Content-type: image/jpeg");
echo $slika;


Kada u IE pokusam da idem na Save As.... dobijem samo mogucnost da snimim kao bmp (sto znaci slika zauzima >1MB). E sad problem je u tome sto korisnik koji gleda sliku MORA da bude u mogucnosti da je snimi na svoj racunar onakvu kakva jeste. Nikako nisam uspeo da resim ovaj problem pa sam dosao i na ideju da ubacim na tu stranicu jedno dugme "Save" pa da korisnik uradi download.... Ima neko ideju?
[ bOkIcA @ 19.01.2004. 14:46 ] @
Evo ti nesto sto sam nasao a davno naskrabao.

Code:
<?php
  $sta_je_za_download = $_GET['file'];
  $putanja_do_fajla = $_GET['path'];
  $velicina_fajla = $_GET['size'];
  if ($sta_je_za_download != ""){
     header("Cache-control: private");
     header("Content-Disposition: attachment; filename=\"".$sta_je_za_download ."\"");
     header("Content-length: $velicina_fajla");
     header("Content-type: image/pjpeg");
     $fp = fopen($putanja_do_fajla.$sta_je_za_download, 'rb');
     fpassthru($fp);
     exit;
  }
?>


Znam da je radilo u IE i Mozilli.

A za custom mime odnosno Content-type pogledaj:
http://www.phpconsulting.com/mimes.php
[ zi:: @ 19.01.2004. 14:59 ] @
Probaj ovaj kod:

Code:

<?
header("Content-Type: image/jpg");
header("Content-Disposition: inline; filename=$slika1");
readfile($slika2);
?>


Primeti da je $slika1 naziv slike koju će user videti, a $slika2 path do slike koju hoćeš da prikažeš.

Može se jos i reći koliko će biti velika slika, pa da browser zna koliko % je učitano,
ali radi i ovako.

[ Dejan Krstic @ 19.01.2004. 15:39 ] @
Hvala puno :)
[ Ilija Studen @ 21.09.2004. 20:32 ] @
Gorane, mogu li videti kod funkcije is_gd2?

Ili je neko rešenje tipa:

Code:
function yeah() { return strpos(gd_info(), '2') === false ? false : true; }


??? :p