No estoy seguro de que esto sea posible, pero estoy buscando escribir un script que devuelva el promedio hex
o el rgb
valor de una imagen. Sé que se puede hacer en AS pero estoy buscando hacerlo en JavaScript.
javascript
image-manipulation
bgreater
fuente
fuente
Respuestas:
AFAIK, la única forma de hacer esto es con
<canvas/>
...DEMO V2 : http://jsfiddle.net/xLF38/818/
Tenga en cuenta que esto solo funcionará con imágenes en el mismo dominio y en navegadores que admitan el lienzo HTML5:
Para IE, consulte excanvas .
fuente
'rgb('+rgb.r+','+rgb.b+','+rgb.g+')'
y debería ser'rgb('+rgb.r+','+rgb.g+','+rgb.b+')'
. es extraño cuando el color dominante es el azul pero el resultado es el verde :).img.crossOrigin = '';
antes de establecer elsrc
atributo. Se encuentra en: coderwall.com/p/pa-2uwcount === length / 4 / blockSize
;)Pensé que publicaría un proyecto que encontré recientemente para obtener un color dominante:
Ladrón de colores
Las otras soluciones que mencionan y sugieren el color dominante nunca realmente responden a la pregunta en el contexto adecuado ("en javascript"). Con suerte, este proyecto ayudará a quienes quieran hacer precisamente eso.
fuente
El "color dominante" es complicado. Lo que quiere hacer es comparar la distancia entre cada píxel y todos los demás píxeles en el espacio de color (Distancia euclidiana) y luego encontrar el píxel cuyo color es más cercano a cualquier otro color. Ese píxel es el color dominante. El color medio suele ser barro.
Ojalá tuviera MathML aquí para mostrarte la distancia euclidiana. Buscalo en Google.
He logrado la ejecución anterior en el espacio de color RGB usando PHP / GD aquí: https://gist.github.com/cf23f8bddb307ad4abd8
Sin embargo, esto es muy costoso computacionalmente. Bloqueará su sistema en imágenes grandes y definitivamente bloqueará su navegador si lo prueba en el cliente. He estado trabajando en refactorizar mi ejecución para: - almacenar resultados en una tabla de búsqueda para uso futuro en la iteración sobre cada píxel. - para dividir imágenes grandes en cuadrículas de 20px 20px para un dominio localizado. - utilizar la distancia euclidiana entre x1y1 y x1y2 para calcular la distancia entre x1y1 y x1y3.
Por favor, avíseme si progresa en este frente. Estaría feliz de verlo. Voy a hacer lo mismo.
Canvas es definitivamente la mejor manera de hacer esto en el cliente. SVG no, SVG está basado en vectores. Después de bajar la ejecución, lo siguiente que quiero hacer es ejecutar esto en el lienzo (tal vez con un webworker para el cálculo de la distancia total de cada píxel).
Otra cosa en la que pensar es que RGB no es un buen espacio de color para hacer esto, porque la distancia euclidiana entre colores en el espacio RGB no está muy cerca de la distancia visual. Un mejor espacio de color para hacer esto podría ser LUV, pero no he encontrado una buena biblioteca para esto, ni ningún algoritmo para convertir RGB a LUV.
Un enfoque completamente diferente sería ordenar los colores en un arco iris y construir un histograma con tolerancia para tener en cuenta los diferentes tonos de un color. No lo he intentado, porque clasificar los colores en un arco iris es difícil, al igual que los histogramas de colores. Podría intentar esto a continuación. Nuevamente, avíseme si logra algún progreso aquí.
fuente
Primero: se puede hacer sin HTML5 Canvas o SVG.
En realidad, alguien logró generar archivos PNG del lado del cliente usando JavaScript , sin lienzo o SVG, usando el esquema de URI de datos .
Segundo: es posible que en realidad no necesite Canvas, SVG o cualquiera de los anteriores.
Si solo necesita procesar imágenes en el lado del cliente, sin modificarlas, todo esto no es necesario.
Puede obtener la dirección de origen de la etiqueta img en la página, realizar una solicitud XHR (lo más probable es que provenga del caché del navegador) y procesarla como un flujo de bytes desde Javascript.
Necesitará una buena comprensión del formato de imagen. (El generador anterior se basa parcialmente en fuentes libpng y podría proporcionar un buen punto de partida).
fuente
Diría a través de la etiqueta de lienzo HTML.
Puede encontrar aquí una publicación de @Georg que habla de un pequeño código del desarrollador de Opera:
Esto invierte la imagen utilizando los valores R, G y B de cada píxel. Puede almacenar fácilmente los valores RGB, luego redondear las matrices rojo, verde y azul, y finalmente convertirlos de nuevo en un código HEX.
fuente
Recientemente me encontré con un complemento jQuery que hace lo que originalmente quería https://github.com/briangonzalez/jquery.adaptive-backgrounds.js en lo que respecta a obtener un color dominante de una imagen.
fuente
Javascript no tiene acceso a los datos de color de píxeles individuales de una imagen. Al menos, tal vez no hasta html5 ... momento en el que es lógico pensar que podrá dibujar una imagen en un lienzo y luego inspeccionar el lienzo (tal vez, nunca lo he hecho yo mismo).
fuente
Solución todo en uno
Personalmente, combinaría Color Thief junto con esta versión modificada de Name that Color para obtener una gama más que suficiente de resultados de colores dominantes para las imágenes.
Ejemplo:
Considere la siguiente imagen:
Puede utilizar el siguiente código para extraer datos de imagen relacionados con el color dominante:
fuente
Se trata de "Cuantificación de color" que tiene varios enfoques como MMCQ (cuantificación de corte mediano modificado) u OQ (cuantificación de octárbol). Diferentes enfoques utilizan K-Means para obtener grupos de colores.
He reunido todo aquí, ya que estaba encontrando una solución para
tvOS
donde hay un subconjunto de XHTML, que no tiene ningún<canvas/>
elemento:Genere los colores dominantes para una imagen RGB con XMLHttpRequest
fuente
Una forma menos precisa pero más rápida de obtener un color promedio de la imagen con
datauri
soporte:fuente
Como se señaló en otras respuestas, a menudo lo que realmente desea es el color dominante en lugar del color promedio que tiende a ser marrón. Escribí un guión que tiene el color más común y lo publiqué en esta esencia.
fuente
Existe una herramienta online pickimagecolor.com que te ayuda a encontrar el color medio o dominante de la imagen, solo tienes que subir una imagen desde tu ordenador y luego hacer clic en la imagen. Da el color promedio en HEX, RGB y HSV. También encuentra los tonos de color que combinan con ese color para elegir. Lo he usado varias veces.
fuente