2013-04-26 3 views
1

Je dois afficher les logos téléchargés par l'utilisateur sur une image de fond. L'arrière-plan du logo doit être transparent. Le problème est que la plupart des utilisateurs ne savent pas comment rendre leurs images transparentes, et encore moins comment utiliser la transparence alpha, donc la plupart des logos téléchargés ont un fond blanc.Comment fusionner des images en utilisant le mode de fusion Photoshop «couleur foncée»?

Dans Photoshop, l'affichage de ces logos sur un arrière-plan fonctionne parfaitement lorsque vous choisissez « Darker Couleur » comme le mode de fusion pour la couche.

J'essaie d'obtenir la même chose en PHP, donc je peux faire ce travail sans Photoshop.

Des idées?

Répondre

0

Personnellement, j'ai eu de meilleurs résultats avec l'image magick que GD, mais il n'est pas disponible sur toutes les plateformes http://php.net/manual/en/imagick.painttransparentimage.php

// Loads image 
    $im = new Imagick($source); 

    // Apply fuzz 
    $im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz); 

    // Writes image 
    $im->setImageFormat('png'); 
    $im->writeImage($target); 
    $im->destroy(); 

Notez que $im->getImagePixelColor(0, 0) obtient la couleur du pixel en haut à gauche de l'image si cela devrait fonctionner avec n'importe quelle couleur BG, ajuster $fuzz selon comment le logo est emplumé, peut probablement le garder bas s'il est toutes les lignes droites et couleurs pleines

Aussi http://www.php.net/manual/en/imagick.trimimage.php est très utile pour enlever l'espace vide dans les images.

0

je peux penser à deux solutions possibles.

On serait d'utiliser le mélange des pixels au niveau du client avec javascript. Cela peut être un peu lourd processeur, donc ce n'est probablement pas la meilleure solution en particulier pour les appareils mobiles et autres poids léger. Il existe une bibliothèque appelée pixastic, qui permet certains modes de fusion de type Photoshop.

L'autre solution serait de traiter l'image téléchargée avec gd2 en php et recréer le logo avec la transparence en remplaçant la couleur d'arrière-plan. Dans ce cas, vous devez connaître la couleur d'arrière-plan utilisée. Et puis, s'ils utilisent également ce même colo dans le logo? Vous ne voudriez pas rendre cela aussi transparent.

Regardez les fonctions php suivantes (entre autres dans la famille):

imagealphablending 
imagecolortransparent 

Personnellement, je préfère opter pour la méthode PHP qui traite l'image et crée un fichier permanent pour être réutilisé chaque fois que nécessaire. Mais encore mieux, je ne compterais pas sur l'utilisateur moyen pour créer des logos.

Si vous avez vraiment besoin d'utilisateurs de créer ce type de fichiers que vous devriez faire presque un outil basé sur le Web qui leur permet de spécifier les zones transparentes, un peu comme l'éditeur d'icônes Visual Studio.

0

Je ne suis pas sûr que les entrailles de PS, mais dans ma propre mise en œuvre (pas en PHP, vous l'esprit) J'approchèrent la tâche de la manière suivante:

  1. Extrait Luma de premier plan et arrière-plan
  2. Comparer les luma d'avant-plan et d'arrière-plan pour créer un masque de pixels
  3. Affectez une sortie basée sur le masque dérivé.

Ma tentative générique pseudocode:

Yfg = FG(:,:,1)*0.299 + FG(:,:,2)*0.587 + FG(:,:,3)*0.114; 
Ybg = BG(:,:,1)*0.299 + BG(:,:,2)*0.587 + BG(:,:,3)*0.114; 
mask = (Yfg > Ybg); 
R = BG(mask) + FG(~mask); 

Bien sûr, diffère du mode « Darken », qui est fait juste un mélange relationnel pour chaque canal RVB.

Je ne sais pas à quel point cette opération serait compliquée en PHP. Je suis plus familier avec le mélange d'images que PHP.

Questions connexes