Transformation d'une image binaire lue d'une DB SQL

Petit nouveau ! | 6 Messages

30 juil. 2009, 13:57

Bonjour,
le code suivant permet de fusionner deux images en une seule. (Un logo mergé avec une image lambda)
Il fonctionne bien avec deux fichiers présents sur mon disque.
<?php
header ("Content-type: image/jpeg");
$source = imagecreatefromjpeg("logo.jpg");
$destination = imagecreatefromjpeg("img_tmp.jpg");
// largeur et hauteur images
$largeur_source = imagesx($source);
$hauteur_source = imagesy($source);
$largeur_destination = imagesx($destination);
$hauteur_destination = imagesy($destination);

// coordonnées du logo dans l'image
$destination_x = $largeur_destination - ($largeur_source+150);
$destination_y =  $hauteur_destination - ($hauteur_source+150);

// On met le logo (source) dans l'image de destination (la photo)
imagecopymerge($destination, $source, $destination_x, $destination_y, 0, 0, $largeur_source, $hauteur_source, 60);

// On affiche l'image de destination qui a été fusionnée avec le logo
imagejpeg($destination);

?>
D'autre part, j'ai une base de donnée qui contient des images en binaire.
Ce que j'aimerai faire, c'est que pour chaque image lue dans la DB, un merge d'un logo soit effectué avant de
transmettre l'image à une page html. (utilisation du 1er programme)

La lecture de la DB se fait de manière suivante:
<?php
$id=$_GET['id'];
mysql_connect('localhost', 'toto', '');
mysql_select_db("essai");
$requete = "SELECT donnees_binaires,type_fichier FROM images_binaires WHERE id=$id";
$resultat = mysql_query($requete);
$donnees = mysql_fetch_array($resultat);
$type = @mysql_result($resultat,0,images_binaires.type_fichier);
$image=$donnees[0];

......
Je récupère l'image dans la variable $image et son type dans $type.
J'arrive à afficher l'image ou a la sauver sur mon DD mais je voudrais directement la transmettre
à la routine de merge (1er programme)

Donc en fait remplacer le $destination = imagecreatefromjpeg("img_tmp.jpg"); par quelque chose du genre
$destination="mon image lue dans la DB"
J'ai essayé une affectation simple du genre $destination=$image mais ça ne fonctionne pas (un message du genre ressource incorrecte...)

Quelqu'un aurait-il une solution?

Merci.

Eléphant du PHP | 453 Messages

31 juil. 2009, 14:35

Hello,

Je t'invite à lire la signature de la fonction imagejpeg() et regarder ceci qui devrait te mettre sur la piste :
*logo.php
// Code en amont
//enregistrement du fichier
imagejpeg($destination,"logo_fin.jpeg"); 
*traitement_logo.php
$nom_image_fin = "chemin/logo_fin.jpeg";
 //action que tu veux...

Au passage, pourquoi stocker les images dans une SGBDR ? Quel est l'intérêt et l'inconvénient ? (...)

Bonne continuation.

Invité
Invité n'ayant pas de compte PHPfrance

31 juil. 2009, 15:29

Excuse moi, mais je ne comprends pas ce que tu veux dire... :?

Pour l'intérêt du stockage, ce projet s'intègre déjà dans une utilisation de DB. Je voulais donc garder une certaine cohérence.

Merci d'avance.

Eléphant du PHP | 453 Messages

31 juil. 2009, 16:52

Excuse moi, mais je ne comprends pas ce que tu veux dire... :?
As tu regardé la signature de imagejpeg() ? Que font les arguments optionnels ?
*traitement_logo.php
$chemin = "images_php/"
$logo = "logo_fin.jpeg";
$chemin_logo = $chemin.$logo;

$donnee_image = (file_exist($chemin_logo))? fread(fopen($chemin_logo,"rb"),filesize($chemin_logo)): "Erreur de traitement";
//etc.
* code faite de tête.
Pour l'intérêt du stockage, ce projet s'intègre déjà dans une utilisation de DB. Je voulais donc garder une certaine cohérence.
Au passage, pourquoi stocker les images dans une SGBDR ? Quel est l'intérêt et l'inconvénient ? (...)
Si tu ne peux pas répondre par toi même à ces questions, je t'invite à faire une recherche via ton ami glouglou.
Modifié en dernier par niuxe le 31 juil. 2009, 17:03, modifié 3 fois.

Eléphant du PHP | 111 Messages

31 juil. 2009, 16:55

C'est intéressant de stocker les images dans la base de données, si l'on souhaite limiter leur accès à des membres par exemple.

C'est la manière la plus sécurisée de le faire en ouaib.

Eléphant du PHP | 369 Messages

31 juil. 2009, 17:06

Bonjour,
le code suivant permet de fusionner deux images en une seule. (Un logo mergé avec une image lambda)
Il fonctionne bien avec deux fichiers présents sur mon disque.
<?php
header ("Content-type: image/jpeg");
$source = imagecreatefromjpeg("logo.jpg");
$destination = imagecreatefromjpeg("img_tmp.jpg");
// largeur et hauteur images
$largeur_source = imagesx($source);
$hauteur_source = imagesy($source);
$largeur_destination = imagesx($destination);
$hauteur_destination = imagesy($destination);

// coordonnées du logo dans l'image
$destination_x = $largeur_destination - ($largeur_source+150);
$destination_y =  $hauteur_destination - ($hauteur_source+150);

// On met le logo (source) dans l'image de destination (la photo)
imagecopymerge($destination, $source, $destination_x, $destination_y, 0, 0, $largeur_source, $hauteur_source, 60);

// On affiche l'image de destination qui a été fusionnée avec le logo
imagejpeg($destination);

?>
D'autre part, j'ai une base de donnée qui contient des images en binaire[*].
Ce que j'aimerai faire, c'est que pour chaque image lue dans la DB, un merge d'un logo soit effectué avant de transmettre l'image à une page html. (utilisation du 1er programme)
La lecture de la DB se fait de manière suivante:
<?php
$id=$_GET['id'];
mysql_connect('localhost', 'toto', '');
mysql_select_db("essai");
$requete = "SELECT donnees_binaires,type_fichier FROM images_binaires WHERE id=$id";
$resultat = mysql_query($requete);
$donnees = mysql_fetch_array($resultat);
$type = @mysql_result($resultat,0,images_binaires.type_fichier);
$image=$donnees[0];
......
Je récupère l'image dans la variable $image et son type dans $type.
J'arrive à afficher l'image ou a la sauver sur mon DD mais je voudrais directement la transmettre
à la routine de merge (1er programme)
Donc en fait remplacer le $destination = imagecreatefromjpeg("img_tmp.jpg"); par quelque chose du genre $destination="mon image lue dans la DB"
J'ai essayé une affectation simple du genre $destination=$image mais ça ne fonctionne pas (un message du genre ressource incorrecte...)
Quelqu'un aurait-il une solution?
Merci.
Desolé pas de solution directe mais un lien ou "justement" est mentionné la fusion d'images:
http://www.siteduzero.com/tutoriel-3-14 ... #ss_part_5

D'accord avec Nolem pour ce qui est du stockage d'img en DB.
Faire pointer une variable de la DB vers l'image est, me semble t'il, mieux adapter.
Pour la sécurité suffit de mettre un .htaccess dans le répertoire images et voila.

@+ les gens

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 453 Messages

31 juil. 2009, 17:18

...C'est la manière la plus sécurisée de le faire en ouaib.
Je suis mitigé sur cette réponse. :/
ht_access :-*

Invité
Invité n'ayant pas de compte PHPfrance

31 juil. 2009, 17:38

Excuse moi, mais je ne comprends pas ce que tu veux dire... :?
As tu regardé la signature de imagejpeg() ? Que font les arguments optionnels ?
*traitement_logo.php
$chemin = "images_php/"
$logo = "logo_fin.jpeg";
$chemin_logo = $chemin.$logo;

$donnee_image = (file_exist($chemin_logo))? fread(fopen($chemin_logo,"rb"),filesize($chemin_logo)): "Erreur de traitement";
//etc.
* code faite de tête.
Pour l'intérêt du stockage, ce projet s'intègre déjà dans une utilisation de DB. Je voulais donc garder une certaine cohérence.
Au passage, pourquoi stocker les images dans une SGBDR ? Quel est l'intérêt et l'inconvénient ? (...)
Si tu ne peux pas répondre par toi même à ces questions, je t'invite à faire une recherche via ton ami glouglou.
@Nolem
Je me suis sans soute mal exprimé, je ne cherche pas à "merger" deux fichiers jpeg présents dans un répertoire. (Ca je sais faire) Pas plus lire un jpeg de ma db, le sauver dans un repertoire sous forme de jpeg puis le merger à un autre fichier. (Ce qui revient au cas précédent)

Je veux lire un jpeg de ma db, appelons le SOURCE_jpg et le merger à un autre fichier, LOGO.jpg qui lui, se trouve bien dans un répertoire. Ce que je veux faire c'est merger SOURCE_jpg avec LOGO.jpg mais sans passer par une sauvegarde de SOURCE_jpg dans un répertoire.
Suis-je plus clair?
Quand à la réponse à tes questions, je pense avoir donné la réponse. Les images sont déjà dans une DB existante (utilisée dans une autre appli). D'autre part, je pense que c'est aussi la meilleure façon d'éviter que des petits malins te vident un répertoire (ou pointent dessus) pour utiliser ton travail ailleurs.
Ils pourront toujours copier les photos à la main, une par une, avec un print d'écran et je leur souhaite alors beaucoup de patience... :-)
Pour glouglou? heu... désolé c'est pour moi du chinois :-)

@FuZZyLine -> Merci. J'avais vu cette page ;-)

Eléphant du PHP | 453 Messages

31 juil. 2009, 18:21

...
Ce que je veux faire c'est merger SOURCE_jpg avec LOGO.jpg mais sans passer par une sauvegarde de SOURCE_jpg dans un répertoire.
Suis-je plus clair?
unlink() et mkdir() si besoin. ;)
...
D'autre part, je pense que c'est aussi la meilleure façon d'éviter que des petits malins te vident un répertoire (ou pointent dessus) pour utiliser ton travail ailleurs.
mauvaise argumentation et c'est faux. Toutes images sur le net peut être reprises et même en grande quantité (un aspirateur de site en exemple)
...Pour glouglou? heu... désolé c'est pour moi du chinois :-)
Google ;)
Modifié en dernier par niuxe le 31 juil. 2009, 18:38, modifié 2 fois.

Invité
Invité n'ayant pas de compte PHPfrance

31 juil. 2009, 18:28

:shock:
Encore une fois, je ne veux pas utiliser de fichier...
J'aime ce genre de réponse... Tu aides les gens parfois ou tu es un adepte du grand sphinx?
Laisse tomber et merci quand même.

Eléphant du PHP | 453 Messages

31 juil. 2009, 18:34

Encore une fois, je ne veux pas utiliser de fichier...
Même les fichiers temporaires ?

Invité
Invité n'ayant pas de compte PHPfrance

31 juil. 2009, 18:37

Non, pas de fichier temporaire non plus :wink:

Eléphant du PHP | 453 Messages

31 juil. 2009, 18:39

Pourquoi ? (????)

Invité
Invité n'ayant pas de compte PHPfrance

31 juil. 2009, 18:46

C'est mon choix 8-)

Eléphant du PHP | 369 Messages

01 août 2009, 10:00

Salut,
Bonjour,
le code suivant permet de fusionner deux images en une seule.
(Un logo mergé avec une image lambda)
Il fonctionne bien avec deux fichiers présents sur mon disque.
[...]
D'autre part, j'ai une base de donnée qui contient des images en binaire.
Ce que j'aimerai faire, c'est que pour chaque image lue dans la DB, un merge d'un logo soit effectué avant de
transmettre l'image à une page html. (utilisation du 1er programme)
La lecture de la DB se fait de manière suivante:
[...]
Je récupère l'image dans la variable $image et son type dans $type.
J'arrive à afficher l'image ou a la sauver sur mon DD mais je voudrais directement la transmettre
à la routine de merge (1er programme)
Donc en fait remplacer le $destination = imagecreatefromjpeg("img_tmp.jpg"); par quelque chose du genre
$destination="mon image lue dans la DB"
J'ai essayé une affectation simple du genre $destination=$image mais ça ne fonctionne pas (un message du genre ressource incorrecte...)
Quelqu'un aurait-il une solution?
Merci.
On reprend *tout* depuis le début (méprise en moins)

1) Tu arrive, à afficher l'image (brut) provenant de ta DB dans une page html ? : OUI
2) Tes 2 images (la brut) & celle servant de merge sont de même type ? : IL SEMBLE
3) Ton script, sus-mentionner, faisant le merge est ainsi ou dans une fonction ? : ?

Dans ta fonction MySql tu mets:
$type = @mysql_result($resultat,0,images_binaires.type_fichier);
Mais $type n'est pas indiqué lors du merge, normal? Et surtout le $type correspond au type
d'image (.jpg .png, ...) ou type de fichier? Que te retourne cette variable? D'autre part
un truc me chifonne, ne manque t'il pas underscore entre binaires ET type ?

Si ton script est dans une fonction le résultat de l'image est retourné ou ne fait que modifier
la variable $destination à l'interieur de la fonction?
<?php
bool  imagecopymerge ( resource   dst_im , resource   src_im , int   dst_x , int   dst_y , int   src_x , int   src_y , int   src_w , int   src_h , int   pct ) 
?>
Que donne la valeur boolean du retour? Au vu de ce que tu as dis il vaut TRUE mais bon...

--- Maintenant la phase la plus charmante
J'aime ce genre de réponse... Tu aides les gens parfois ou tu es un adepte du grand sphinx?
Laisse tomber et merci quand même.
Tu poses une question, on essaie d'y répondre. Que la réponse soit celle attendue ou pas
il est inutile d'être désagréable. On est pas payé pour suivre un topic... Sinon ca se saurait.

@+ bon code, bon we les gens ;)