[GD]blob et image miniature

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [GD]blob et image miniature

par zeus » 23 févr. 2008, 23:52

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

par Invité » 23 févr. 2008, 21:41

Effectivement je viens de découvrir ces fonctions et tout marche parfaitement.
J'ai fini la partie la plus délicate du site :D
Voici le code pour ceux que cela intéresse.
//récupère les infos en base.
header('Content-Type: '.$photo['photo_type']);
    $source = imagecreatefromstring($photo['photo_blob']);
    
    $width_src = imagesx($source);
    $height_src = imagesy($source);
    if ($width && ($width_src < $height_src)) {
       $width = ($height / $height_src) * $width_src;
    } else {
       $height = ($width / $width_src) * $height_src;
    }
    $ext = explode("/", $photo['photo_type']);
    $destination = imagecreatetruecolor ($width, $height) or die ("Erreur pour créer l'image");
    // on créé un cadre autour de la miniature
    $blanc = imagecolorallocate ($destination, 255, 255, 255);
    $gris[0] = imagecolorallocate ($destination, 69, 69, 69);
    $gris[1] = imagecolorallocate ($destination, 82, 82, 82);
    $gris[2] = imagecolorallocate ($destination, 97, 97, 97);
    $gris[3] = imagecolorallocate ($destination, 107, 107, 107);
    $gris[4] = imagecolorallocate ($destination, 120, 120, 120);
    $gris[5] = imagecolorallocate ($destination, 134, 134, 134);
    $gris[6] = imagecolorallocate ($destination, 145, 145, 145);
    
    for ($i=0; $i<7; $i++) {
       imagefilledrectangle($destination, $i, $i, $width-$i, $height-$i, $gris[$i]);
    }
    // créé la miniature : attention fonction lourde
    imagecopyresampled($destination, $source, 8, 8, 0, 0, $width-(2*8), $height-(2*8), $width_src, $height_src);
   
    call_user_func('image'.$ext[1], $destination);
    
    imagedestroy($source);
    imagedestroy($destination);
Voici comment appeler la fonction :

Code : Tout sélectionner

<img src="image.php?id=<?php echo $photos[0]['photo_id']; ?>"/>


Merci de ton aide :pouce:

par Ryle » 23 févr. 2008, 21:27

Prend le temps de consulter la doc des fonctions que tu utilises et regarde bien le type des paramètres qu'elle prennent en arguments et de ceux qu'elles retournent :)

La fonction getImageSize() attends un String en premier argument, celui-ci étant le chemin qui indique l'emplacement de ton fichier image sur le disque. Or, dans ton cas, il n'y a pas de fichier sur le disque. Ce n'est donc pas la bonne fonction à utiliser.

Regardes du côté de imagesx() et imagesy() ;)

par Invité » 23 févr. 2008, 18:36

Alors j'ai essayé plusieurs chose, mais je n'arrive pas à récupérer les dimensions j'ai une erreur :
//header('Content-Type: '.$photo['photo_type']);
    $source = imagecreatefromstring($photo['photo_blob']);
    
    list($width_src, $height_src) = getimagesize($source);
    if ($width && ($width_src < $height_src)) {
       $width = ($height / $height_src) * $width_src;
    } else {
       $height = ($width / $width_src) * $height_src;
    }
    
    echo "width: ";
    echo $width;
    echo "\n";
    echo "height: ";
    echo $height;
    exit;
Warning: getimagesize() [function.getimagesize]: Unable to access Resource id #5 in /opt/coolstack/apache2/htdocs/Website/image.php on line 17

Warning: getimagesize(Resource id #5) [function.getimagesize]: failed to open stream: No such file or directory in /opt/coolstack/apache2/htdocs/Website/image.php on line 17

Warning: Division by zero in /opt/coolstack/apache2/htdocs/Website/image.php on line 21
width: 200 height: 0

par Ryle » 23 févr. 2008, 14:34

Il faut procéder par étape, première chose à faire, c'est lire ton image en base et construire la "ressource" php sur laquelle tu vas pouvoir travailler, chose que tu fais déjà avec imagecreatefromstring()

Une fois que tu as ton image sous forme de ressource, tu vas pouvoir la redimensionner, pas besoin pour cela de passer par un imageCreateFromXXX, puisque le but de ces fonctions est justement de construire la ressource en fonction du type de fichier.

Tu vas donc pouvoir directement utiliser la fonction imagecopyresized() qui permet de redimensionner ton image. Il te faudra pour cela créer une autre ressource pour accueillir la nouvelle image, mais la doc de la fonction te donneront les exemples nécessaire pour cela :)

Enfin, une fois ta nouvelle ressource prête, il ne te restera plus qu'à l'enregistrer sur le disque ou en base ou à la transmettre directement au navigateur. Redimensionner l'image à chaque fois prend du temps et des ressources, la stocker occupe de la place mais ira forcément plus vite...

par Invité » 23 févr. 2008, 14:04

Quant au fait de stocker ton image directement en base, à moins d'avoir besoin de travailler sur des formes, des couleurs, de la luminosité, etc., j'ai pas encore trouvé de raison vallable de surcharger sa base de données
Tu as surement raison mais le premier tutorial clair que j'ai trouvé pour l'upload d'image en php, le faisait de cette façon. Je changerai peut être plus tard, pour l'instant j'aimerai déja avoir une appli fonctionnel. Et puis il y a le coté pratique de la suppression en cascade des images lorsque l'on supprime l'objet sur lequel l'image est rataché, alors qu'avec le stockage sur le système de fichier il aurai fallu : 1 - Supprimer l'objet en base. 2 - Supprimer le fichier. Sa demande peut etre pas plus que ça a faire, mais n'étant pas un pros du php, j'ai préféré tout stocker en base.
Concernant mon problème j'avance à petit pas. J'arrive à afficher l'image, mais pas la réduire puis l'afficher.
Ce code ne fonctionne pas.
header('Content-Type: '.$photo['photo_type']);
   header('Content-Type: '.$photo['photo_type']);
    //$image = imagecreatefromstring($photo['photo_blob']);
    $ext = explode("/", $photo['photo_type']);
    $source = call_user_func('createimagefrom'.$ext[1], $photo['photo_blob']);
    call_user_func('image'.$ext[1], $source);
Celui ci fonctionne et affiche l'image pourtant je fais à peu prés la même chose non ? Enfin j'aimerai comprendre la différence et comment faire fonctionner ceci ?
header('Content-Type: '.$photo['photo_type']);
    $image = imagecreatefromstring($photo['photo_blob']);
    $ext = explode("/", $photo['photo_type']);
    //$source = call_user_func('createimagefrom'.$ext[1], $photo['photo_blob']);
    call_user_func('image'.$ext[1], $image);

par Ryle » 23 févr. 2008, 13:06

La fonction mysql_real_escape_string() ne sert qu'à protéger une chaine lorsque l'on souhaite l'utiliser dans une requête sql (pour protéger les apostrophes, etc.). Une fois la requête exécutée, la valeur en base (et donc celle que tu récupèreà est celle d'origine, non protégée. Il te faut donc l'utiliser telle qu'elle pour reconstruire ton image :)

Quant au fait de stocker ton image directement en base, à moins d'avoir besoin de travailler sur des formes, des couleurs, de la luminosité, etc., j'ai pas encore trouvé de raison vallable de surcharger sa base de données :)

par Invité » 23 févr. 2008, 09:17

Code : Tout sélectionner

$data = mysql_real_escape_string($photos[0]['photo_blob']); $image = imagecreatefromstring($data);
J'ai cette erreur :

Warning: imagecreatefromstring() [function.imagecreatefromstring]: Passed data is not in 'JPEG' format in /opt/coolstack/apache2/htdocs/Website/showDetails.php on line 43

Warning: imagecreatefromstring() [function.imagecreatefromstring]: Couldn't create GD Image Stream out of Data in /opt/coolstack/apache2/htdocs/Website/showDetails.php on line 43

[GD]blob et image miniature

par Invité » 22 févr. 2008, 22:52

Bonsoir, je stock en base des images, directement le contenu binaire de l'image (je sais c'est une mauvaise idée, mais pas tout le temps :)), et je voudrais les afficher en miniature sur ma page. Est il possible de le faire en utilisant GD, cad récupéré le binaire et en créé une image puis la miniaturiser ?
Merci.