2016-08-09 5 views
0

Mon sujet concerne l'ajout de filigrane aux images à l'aide du code PHP. Exemple est ici http://php.net/manual/en/image.examples-watermark.phpPourquoi la taille devient plus grande lors de l'utilisation de imagecreatefromjpeg/png/gif/bmp au besoin pour ajouter un filigrane

Je fais face à un problème est que l'exemple mentionné traite seulement des images JPEG seulement car il utilise la fonction imagecreatefromjpeg().

J'ai utilisé cette fonction Je ne me souviens pas d'où je l'ai eu. Il crée une image d'autres types png, bmp et gif.

function imageCreateFromAny($filepath){ 
    $type = exif_imagetype($filepath); // [] if you don't have exif you could use getImageSize() 
    $allowedTypes = array(
     1, // [] gif 
     2, // [] jpg 
     3, // [] png 
     6 // [] bmp 
    ); 
    if (!in_array($type, $allowedTypes)) { 
     return false; 
    } 
    switch ($type) { 
     case 1 : 

      $im = imageCreateFromGif($filepath); 
     break; 
     case 2 : 

      $im = imageCreateFromJpeg($filepath); 
     break; 
     case 3 : 

      $im = imageCreateFromPng($filepath); 
     break; 
     case 6 : 

      $im = imageCreateFromBmp($filepath); 
     break; 
    } 
    return $im; 
} 

LE PROBLÈME: L'image de sortie de la fonction est une image de son numéro de taille, est multiplié par quatre, je veux dire la taille devient plus gros près de 4 fois. Par exemple, si la fonction a reçu l'image au format 94K, elle l'affiche autour de 380K.

Je veux résoudre le problème de maximiser le nombre de taille, je veux obtenir la même taille d'image avant la taille de l'image était entrée à la fonction imageCreateFromAny (filepath de $)

Astuce: Le ci-dessous fonction est appelant la fonction ci-dessus

function Stamp($filename){ 




     // Load the stamp and the photo to apply the watermark to 
     $stamp = imagecreatefrompng('../../style/images/stamp1.png'); 
//  $im = imagecreatefromjpeg('../../gallery/black-white/'.$filename); 
     $im = imageCreateFromAny('../../gallery/black-white/'.$filename); 


     // Set the margins for the stamp and get the height/width of the stamp image 
     $marge_right = 10; 
     $marge_bottom = 10; 
     $sx = imagesx($stamp); 
     $sy = imagesy($stamp); 

     // Copy the stamp image onto our photo using the margin offsets and the photo 
     // width to calculate positioning of the stamp. 
     imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp)); 

     // Output and free memory 
//  header('Content-type: image/png'); 
//  imagepng($im); 
     $filename_new = '../../gallery/black-white/'.$filename.''; 
//  if (move_uploaded_file(imagepng($im), '../../gallery/black-white/2' )) 
     imagepng($im, $filename_new); 
     imagedestroy($im); 


} 
+1

Cette fonction particulière ne renvoie pas du tout "une image", elle renvoie une * ressource d'image * dont la taille est un peu difficile à mesurer. Où exactement transformez-vous cela en un fichier image mesurable? – deceze

+2

La taille jpeg est non-déterministe. Vous ne pouvez pas dire exactement quelle sera la taille du fichier final, car cela dépend entièrement des paramètres de compression et de la structure de l'image elle-même. une image "bruyante" avec beaucoup de détails produira un fichier .jpg plus grand qu'une simple image avec de grandes zones de couleur "constante". Si votre nouvelle image est plus grande que l'original, vous avez utilisé un autre paramètre de qualité jpeg ou introduit plus de bruit. –

+0

veuillez patienter. Je vais mettre à jour le post. @deceze – Diamond

Répondre

3

vous enregistrez l'image au format PNG, qui, oui, est souvent beaucoup plus grand qu'un JPEG, mais a aussi une qualité supérieure. JPEG est un format avec perte, qui rejette la qualité pour une taille de fichier plus petite. PNG est un format sans perte, qui conserve toutes les informations possibles et essaie simplement de compresser les données autant que possible. Pour une image avec beaucoup de détails, cela se traduira par des tailles massivement plus grandes que JPEG avec un réglage de qualité faible.

+0

alors quoi? voulez-vous que je mette à jour: imagepng(); ? Que dois-je faire? Ou quelles sont vos suggestions? – Diamond

+0

J'ai changé imagepng() en imagejpeg() et j'ai eu la moitié de la taille. C'est un autre problème pour moi. Je veux sortir la même taille que l'entrée. – Diamond

+0

Fondamentalement, vous ne pouvez pas. Vous recompilez un format de fichier avec perte, vous n'obtiendrez pas la même taille, sauf peut-être par pur hasard. Vous pouvez contrôler la qualité JPEG avec le paramètre de qualité, ce qui va influencer la taille; mais il n'y a fondamentalement pas d'option "garder la même taille". – deceze