[PHP] Thumbnailer

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Noodels
  • Registratie: Februari 2004
  • Niet online
Ik ben een siteje aan het maken maar krijg het niet voor elkaar om het werkend te krijgen ik zit namelijk met het probleem dat hij geen thumbnail maakt...

alleen dan heb ik wel de normale foto alleen geen thumbnail

Waar kan dat aan liggen?
Ik draai MYSQL 4.0.18

[ Voor 81% gewijzigd door Noodels op 31-05-2004 12:51 ]


Acties:
  • 0 Henk 'm!

  • mjax
  • Registratie: September 2000
  • Laatst online: 19:56
Misschien enigszins offtopic, maar jouw code maakt geen thumbnail. Je saved gewoon de originele JPEG in een lagere kwaliteit. Voor thumbnails moet je eens in de php manual (online) onder imagecopyresampled() kijken. Daar staan zat voorbeelden!

Acties:
  • 0 Henk 'm!

  • baZzz.com
  • Registratie: September 2002
  • Laatst online: 23-08 11:41
loadjpeg() is i.i.g. geen officiële functie binnen PHP, dus die zul je ergens zelf gedefineerd moeten hebben... Ik zie zo niet waar, dus heb je dat wel gedaan?
[open deur]Zomaar een functie aanroepen die niet bestaat gaat voor problemen zorgen natuurlijk...[/open deur]

-vliegen is jezelf op de grond werpen en missen-


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 21:46
Die manier van thumnails maken is volgens mij niet de juiste manier. Er zijn zat code examples en/of tutorials over dit onderwerp te vinden, foto gallery's enzo.

Dit is een een oud stuk code, uit een class, welke ik ooit zelf eens heb geschreven. Wellicht heb je er wat aan. Dit is zo ongeveer de manier waarop je thumbnails kunt genereren:
PHP:
1
2
3
4
5
6
7
8
9
$source = imagecreatefromjpeg("$this->_highresdir"."$this->_file");
$old_w = imagesx($source);
$old_h = imagesy($source);
$this->_thumb_heigth = $this->countHeigth($old_w, $old_h);
$destination = imagecreatetruecolor($this->_thumb_width, $this->_thumb_heigth);
imagecopyresampled($destination, $source, 0, 0, 0, 0, $this->_thumb_width, $this->_thumb_heigth, $old_w, $old_h);
imagejpeg($destination, "$this->_thumbdir"."$i.jpg", 75);
imagedestroy($source);
imagedestroy($destination);


De preciese werking van de meeste functies staan beschreven in de php manual.

Acties:
  • 0 Henk 'm!

  • Noodels
  • Registratie: Februari 2004
  • Niet online
baZzz.com schreef op 11 maart 2004 @ 21:11:
loadjpeg() is i.i.g. geen officiële functie binnen PHP, dus die zul je ergens zelf gedefineerd moeten hebben... Ik zie zo niet waar, dus heb je dat wel gedaan?
:P

[ Voor 87% gewijzigd door Noodels op 31-05-2004 12:51 ]


Acties:
  • 0 Henk 'm!

  • iMars
  • Registratie: Augustus 2001
  • Laatst online: 18:46

iMars

Full time prutser

Misschien kunnen we elkaar helpen ;)
mijn stuk script is zodanig gemaakt dat hij van elk foto die wordt ge-uploaded, die groter is dan 800x600 of 600x800, dan resized ie hem.

Werkt prima, alleen krijg ik na resizen het plaatje niet meer in mijn database.
Iemand die mij kan vertellen hoe ik dat voor elkaar krijg?


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
if ($_FILES['foto1']['tmp_name'] != "none") /* het bestand mag uiteraard niet leeg zijn */ 
{
    $fp = @fopen($_FILES['foto1']['tmp_name'],"r"); /* poging tot openen van het bestand */ 
    if ($fp) /* als het openen is gelukt */
    {
        if($_FILES['foto1']['type']=="image/pjpeg")
        {
            $content = fread($fp,filesize($_FILES['foto1']['tmp_name'])); /* eerst de inhoud van t bestand uitlezen */ 
            fclose($fp); /* bestand sluiten */ 
            $size = 600; /* max 600 pixels hoog */
            $src = imagecreatefromstring ($content);
            $width = imagesx($src);
            $height = imagesy($src);
            $aspect_ratio = $height/$width;  
            if ($height <= $size)
            {
                $new_w = $width;
                $new_h = $height;
            }
            else
            {
                $new_h = $size;
                $new_w = abs($new_h / $aspect_ratio);
            }
            if ($new_w > 800) /* als ie toch nog breder is als 800, nog kleiner maken :) */
            {
                $new_w = 800;
                $new_h = abs($new_w * $aspect_ratio);
            }
            $img = ImageCreate($new_w,$new_h);
            ImageCopyResized ($img,$src,0,0,0,0,$new_w,$new_h,$width,$height);
            $content = ImageJPEG($img,'',85); /* hier gaat het bij mij niet goed. $img kan ik niet in de database zetten, iemand die mij de goudentip kan geven ??? */
            imagedestroy($img);
            $query = mysql_query("INSERT INTO foto VALUES(0,'".$id."','".$HTTP_POST_FILES['foto1'][name]."','image/pjpeg','".filesize($content)."','".addslashes($content)."')");
        }
    }
    else
    {
        $errMessage = "Geen jpeg of gif bestand";
    }
}
else  /* als het bestand niet geopend kan worden, dus !$fp */ 
{
    $errMessage = "Kan bestand niet openen";
}

Koop hier mijn P1 reader :)


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 22-09 13:03
webmail, volgens mij klopt er niets van je if {} else constructies, die zitten een beetje scheef lijkt het wel.

Verder heb ik hier een mooi stukje code voor thumbnails, ook met zwarte balken etc om de plaatjes toch mooi vierkant te houden (aangezien dat altijd 1 van mijn grootste ergenissen was)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
    function _image_info($src)
    {
        list($source->width, $source->height, $source->type_num, $source->attr) = getimagesize($src);
        switch($source->type_num)
        {
            case 1: $source->type = "gif"; break;
            case 2: $source->type = "jpg"; break;
            case 3: $source->type = "png"; break;
            case 4: $source->type = "swf"; break;
            case 5: $source->type = "psd"; break;
            case 6: $source->type = "bmp"; break;
            case 7: $source->type = "tiff"; break;
            case 8: $source->type = "tiff"; break;
            case 9: $source->type = "jpc"; break;
            case 10: $source->type = "jp2"; break;
            case 11: $source->type = "jpx"; break;
            case 12: $source->type = "jb2"; break;
            case 13: $source->type = "swc"; break;
            case 14: $source->type = "iff"; break;
            case 15: $source->type = "wmbp"; break;
            case 16: $source->type = "xbm"; break;
            default: $source->type = "unknown"; break;
        }
        return $source;
    }

    # **********************************************************************************************************************
    # _image_resize();
    # This function will resize an image (JPG or PNG) , with the following parameters.
    #
    # src           source file, for input
    # dst           destination file, for output
    # max_height    the maximum height value
    # max_width     the maximum width value
    # quality       percentage of compression going to be used (default : 100%)
    # enlarge       when true AND when an image is smaller than max_height & max_width : the image will be
    #   scaled larger, default value = false, because this will cause weird pixel effects in most cases.
    # square        when true : image will be a square , but with black borders where needed to keep proportions
    # *********************************************************************************************************************
    function _image_resize($src, $dst, $max_height, $max_width, $quality = 100, $enlarge = false, $square = true)
    {
        $picBG = "0,0,0"; 
        $picFG = "104,104,104"; 
        $font = 1;

        $source = _image_info($src);
        $source->file = $src;

        $dest->file = $dst;
        $dest->header = "Content-type: image/".$source->type;

        if ($source->width >= $source->height)
        {
            $ratio = $source->width / $max_width;
            $dest->height = floor($source->height / $ratio);
            $dest->width = $max_width;
        }
        else
        {
            $ratio = $source->height / $max_height;
            $dest->width = floor($source->width / $ratio);
            $dest->height = $max_height;
        }
        if ($enlarge == false)
        {
            if (($dest->height > $source->height) OR ($dest->width > $source->height))
            {
                $dest->width = $source->width;
                $dest->height = $source->height;
            }
        }

    //      header($dest->header);

        switch($source->type_num) {
           case 2:
               $source->image = imageCreateFromJPEG($source->file);
               break;
           case 3:
               $source->image = imageCreateFromPNG($source->file);
               break;
        }

        if ($square == true)
        {
            if ($dest->width > $dest->height)
            {
                $dest->image = imagecreatetruecolor($dest->width, $dest->width);
                $posX = 0;
                $posY = ($dest->width - $dest->height) / 2;
            }
            else
            {
                $dest->image = imagecreatetruecolor($dest->height, $dest->height);
                $posY = 0;
                $posX = ($dest->height - $dest->width) / 2;
            }
        }
        else
        {
            $dest->image = imagecreatetruecolor($dest->width, $dest->height);
            $posX = 0;
            $posY = 0;
        }

        @imagecopyresampled($dest->image, $source->image, $posX, $posY, 0, 0, $dest->width, $dest->height, $source->width, $source->height);

        switch($source->type_num)
        {
           case 2: @imageJPEG($dest->image, $dest->file, $quality); break;
           case 3: @imagePNG($dest->image, $dest->file); break;
        }
    }



Ook zou ik je aanraden, de plaatjes niet in de database te zetten, aangezien dit erg veel performance kost om die er weer uit te halen, je zou ze beter op het filesystem kunnen opslaan (evt met rare ge-md5-de namen oid).

[ Voor 9% gewijzigd door sorted.bits op 12-03-2004 07:36 ]


Acties:
  • 0 Henk 'm!

  • Noodels
  • Registratie: Februari 2004
  • Niet online
Oke ik misde dus de 'GD" module van PHP....
(duurd ff voordat je daar achter bent zeg...)

Maar apt-get install php4-gd2 lost dan een hoop op.....
Pagina: 1