Je ne suis pas sûr que cela soit possible, mais je cherche à écrire un script qui renverrait la moyenne hex
ou la rgb
valeur d'une image. Je sais que cela peut être fait en AS, mais je cherche à le faire en JavaScript.
javascript
image-manipulation
plus grand
la source
la source
Réponses:
AFAIK, la seule façon de le faire est avec
<canvas/>
...DÉMO V2 : http://jsfiddle.net/xLF38/818/
Notez que cela ne fonctionnera qu'avec les images du même domaine et dans les navigateurs prenant en charge le canevas HTML5:
Pour IE, consultez les excanvas .
la source
'rgb('+rgb.r+','+rgb.b+','+rgb.g+')'
et cela devrait être'rgb('+rgb.r+','+rgb.g+','+rgb.b+')'
. c'est étrange quand la couleur dominante est le bleu mais le résultat est vert :).img.crossOrigin = '';
avant de définir l'src
attribut. Trouvée sur: coderwall.com/p/pa-2uwcount === length / 4 / blockSize
;)Je pensais que je publierais un projet que j'ai récemment rencontré pour obtenir une couleur dominante:
Voleur de couleurs
Les autres solutions mentionnant et suggérant la couleur dominante ne répondent jamais vraiment à la question dans le bon contexte ("en javascript"). Espérons que ce projet aidera ceux qui veulent faire exactement cela.
la source
"Dominant Color" est délicat. Ce que vous voulez faire, c'est comparer la distance entre chaque pixel et tous les autres pixels de l'espace colorimétrique (distance euclidienne), puis trouver le pixel dont la couleur est la plus proche de toutes les autres couleurs. Ce pixel est la couleur dominante. La couleur moyenne sera généralement de la boue.
J'aurais aimé avoir MathML ici pour vous montrer la distance euclidienne. Recherche le sur Google.
J'ai effectué l'exécution ci-dessus dans l'espace colorimétrique RVB en utilisant PHP / GD ici: https://gist.github.com/cf23f8bddb307ad4abd8
Ceci est cependant très coûteux en calcul. Il plantera votre système sur de grandes images et plantera définitivement votre navigateur si vous l'essayez dans le client. J'ai travaillé sur la refactorisation de mon exécution pour: - stocker les résultats dans une table de recherche pour une utilisation future dans l'itération sur chaque pixel. - pour diviser de grandes images en grilles de 20px 20px pour une dominance localisée. - utiliser la distance euclidienne entre x1y1 et x1y2 pour déterminer la distance entre x1y1 et x1y3.
Veuillez me faire savoir si vous faites des progrès sur ce front. Je serais heureux de le voir. Je vais faire la même chose.
Canvas est certainement le meilleur moyen de le faire chez le client. SVG ne l'est pas, SVG est basé sur des vecteurs. Une fois l'exécution terminée, la prochaine chose que je veux faire est de faire fonctionner cela dans le canevas (peut-être avec un webworker pour le calcul de la distance globale de chaque pixel).
Une autre chose à laquelle il faut penser est que RVB n'est pas un bon espace colorimétrique pour faire cela, car la distance euclidienne entre les couleurs dans l'espace RVB n'est pas très proche de la distance visuelle. Un meilleur espace colorimétrique pour faire cela pourrait être LUV, mais je n'ai pas trouvé de bonne bibliothèque pour cela, ni d'algorithmes pour convertir RVB en LUV.
Une approche entièrement différente consisterait à trier vos couleurs dans un arc-en-ciel et à créer un histogramme avec une tolérance pour tenir compte des différentes nuances d'une couleur. Je n'ai pas essayé cela, car le tri des couleurs dans un arc-en-ciel est difficile, tout comme les histogrammes de couleurs. Je pourrais essayer ceci ensuite. Encore une fois, faites-moi savoir si vous faites des progrès ici.
la source
Premièrement: cela peut être fait sans HTML5 Canvas ou SVG.
En fait, quelqu'un a juste réussi à générer des fichiers PNG côté client en utilisant JavaScript , sans canevas ni SVG, en utilisant le schéma d'URI de données .
Deuxièmement: vous n'aurez peut-être pas besoin du tout de Canvas, SVG ou de tout ce qui précède.
Si vous avez seulement besoin de traiter les images côté client, sans les modifier, tout cela n'est pas nécessaire.
Vous pouvez obtenir l'adresse source à partir de la balise img sur la page, lui faire une requête XHR - elle proviendra probablement du cache du navigateur - et la traiter comme un flux d'octets à partir de Javascript.
Vous aurez besoin d'une bonne compréhension du format d'image. (Le générateur ci-dessus est partiellement basé sur des sources libpng et pourrait fournir un bon point de départ.)
la source
Je dirais via la balise HTML canvas.
Vous pouvez trouver ici un article de @Georg parlant d'un petit code du développeur Opera:
Cela inverse l'image en utilisant les valeurs R, V et B de chaque pixel. Vous pouvez facilement stocker les valeurs RVB, puis arrondir les tableaux rouge, vert et bleu, et enfin les reconvertir en un code HEX.
la source
Je suis récemment tombé sur un plugin jQuery qui fait ce que je voulais à l'origine https://github.com/briangonzalez/jquery.adaptive-backgrounds.js en ce qui concerne l'obtention d'une couleur dominante à partir d'une image.
la source
Javascript n'a pas accès aux données de couleur des pixels individuels d'une image. Au moins, peut-être pas avant html5 ... à quel point il va de soi que vous serez capable de dessiner une image sur une toile, puis d'inspecter la toile (peut-être que je ne l'ai jamais fait moi-même).
la source
Solution tout-en-un
Personnellement, je combinerais Color Thief avec cette version modifiée de Name that Color pour obtenir un éventail plus que suffisant de résultats de couleurs dominantes pour les images.
Exemple:
Considérez l'image suivante:
Vous pouvez utiliser le code suivant pour extraire les données d'image relatives à la couleur dominante:
la source
Il s'agit de la "Quantification des couleurs" qui a plusieurs approches comme MMCQ (Quantification Médiane Modifiée) ou OQ (Quantification Octree). Différentes approches utilisent des K-Means pour obtenir des groupes de couleurs.
J'ai tout rassemblé ici, depuis que je cherchais une solution
tvOS
là où il y a un sous-ensemble de XHTML, qui n'a pas<canvas/>
élément:Générer les couleurs dominantes pour une image RVB avec XMLHttpRequest
la source
Moyen moins précis mais le plus rapide d'obtenir une couleur moyenne de l'image avec
datauri
support:la source
Comme indiqué dans d'autres réponses, souvent ce que vous voulez vraiment la couleur dominante par opposition à la couleur moyenne qui a tendance à être brune. J'ai écrit un script qui obtient la couleur la plus courante et je l'ai posté sur cet essentiel
la source
Il existe un outil en ligne pickimagecolor.com qui vous aide à trouver la couleur moyenne ou dominante de l'image, il vous suffit de télécharger une image depuis votre ordinateur puis de cliquer sur l'image. Il donne la couleur moyenne en HEX, RVB et HSV. Il trouve également les nuances de couleur correspondant à cette couleur à choisir. Je l'ai utilisé plusieurs fois.
la source