El negativo de una imagen

facebook-svg gplus-svg twitter-svg

A continuación veremos un ejemplo práctico de como manipular una imagen. Para ser más exactos veremos como poner una imagen en negativo en el <canvas>.
Importante: si queremos experimentar manipulando imágenes en el <canvas> tenemos que hacerlo en un sitio web de verdad, como por ejemplo locahost

  JavaScript Descripción Defecto
width imgData.width Devuelve el ancho del objeto ImageData, en píxeles  
height imgData.height Devuelve la altura del objeto ImageData, en píxeles  
data imageData.data Devuelve un objeto conteniendo todos los datos del objeto ImageData.  
createImageData() context.createImageData( ancho, alto ); Crea un nuevo objeto ImageData en blanco. Toma dos argumentos: la anchura y la altura del objeto creado  
createImageData() context.createImageData(imgData); Crea un nuevo objeto ImageData con las mismas dimensiones que el objeto especificado por el argumanto imgData.  
getImageData() context.getImageData ( x, y, ancho, alto ); Devuelve un objeto ImageData que copia los datos de los píxeles del rectángulo especificado.  
putImageData() context.putImageData( imgData, x, y, [dirtyX, dirtyY, dirtyWidth, dirtyHeight] ); Pone los datos de la imagen (de un objeto ImageData especificado) de nuevo en el canvas  

Vea la chuleta con las propiedades y metodos() de canvas.

Colores complementarios con rgb.

Llamamos colores complementarios los colores diametralmente opuestos en el circulo cromático.
Para encontrar el color complementario de un color dado en rgb, empezamos separando el color en sus componentes cromáticos.
Tomemos por ejemplo este verde: rgb(106, 177, 80). Sus componentes cromáticos son:

r (rojo) = 106
g (verde) = 177
b (azul) = 80;

A continuación calculamos el valor de cada componente cromático del color complementario ( diametralmente opuesto ), teniendo en cuenta que el valor máximo que pueden tomar estos componentes es 255.

r (rojo) = 255 – 106 = 149
g (verde) = 255 - 177 = 78
b (azul) = 255 – 80 = 175

El código rgb del color complementario es : rgb(149, 78, 175).

Invertir los colores de una imagen

Para sacar el negativo de una imagen en colores, hay que acceder uno por uno cada pixel de esta imagen y cambiar el color del pixel por el color complementario, y esto ya sabemos como hacerlo.
Esta vez no manipulamos toda la imagen sino una zona. El método putImageData() toma en este caso siete argumentos:

- la imagen manipulada imgData,
- las coordenadas x e y de donde poner la imagen en el <canvas>
- las coordenadas dirtyX y dirtyY de donde empezar a manipular la imagen
- la anchura dirtyWidth y la altura dirtyHeight del rectángulo manipulado.


enfeinada
Su navegador no soporta canvas :( 

window.onload = function() {
var canvas = document.getElementById("lienzo");
if (canvas && canvas.getContext) {
  var ctx = canvas.getContext("2d");
  if (ctx) {
    var srcImg = document.getElementById("enfeinada");
	// dibuja la imagen en el canvas
    ctx.drawImage(srcImg, 0, 0, ctx.canvas.width, ctx.canvas.height);
	//Devuelve un objeto imgData con los datos de todos los píxeles de la imagen
    var imgData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
    var pixels = imgData.data;
	// recorre uno a uno los pixeles de la imagen y cambia el color por el complementario
    for (var i = 0; i < pixels.length; i += 4) {
      pixels[i] = 255 - pixels[i]; // rojo
      pixels[i + 1] = 255 - pixels[i + 1]; // verde
      pixels[i + 2] = 255 - pixels[i + 2]; // azul
    }
	// pone la imagen modificada en el canvas
	// observe que dirtyX = 25 y dirtyY = 25 
    ctx.putImageData(imgData, 0, 0, 25, 25, 200, 182);
    }
  }
}
enfeinada Su navegador no soporta canvas :(