SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: kalixe985 en Miércoles 12 de Diciembre de 2007, 01:29

Título: Guardar Bitmaps Con Contraste U Opacidad
Publicado por: kalixe985 en Miércoles 12 de Diciembre de 2007, 01:29
Hola!!!!
Me gustaría saber si en C# hay alguna forma de guardar los Bitmaps, pero añadiendoles o quitándoles contraste o añadiendoles o quitandoles opacidad. Concretamente, lo que quiero es guardar 2 versiones de una misma imagen, una normal y otra con más contraste (más luminosa), para luego utilizar estas 2 imágenes en un botón una aplicación fuera de C#. La imagen normal sería la que aparecería cunado el botón está en estado normal y la imagen con contraste sería la que aparecería cuando hago click o MouseHover, por ejemplo.
He mirado si existe una propiedad Opacity para los Bitmap o los Image, pero me parece que no hay.

A ver si alguien me puede ayudar, gracias de antemano!!!!
Salu2!!!
Título: Re: Guardar Bitmaps Con Contraste U Opacidad
Publicado por: JuanK en Jueves 13 de Diciembre de 2007, 02:16
edita la imagen en una app externa
crea las dos imagenes y lueo por codigo alternas las imagenes en el boton...
no es necesario que te compliques aplicando tu mismo... por codigo el contraste a la imagen...
Título: Re: Guardar Bitmaps Con Contraste U Opacidad
Publicado por: kalixe985 en Jueves 13 de Diciembre de 2007, 11:21
Cita de: "JuanK"
edita la imagen en una app externa
crea las dos imagenes y lueo por codigo alternas las imagenes en el boton...
no es necesario que te compliques aplicando tu mismo... por codigo el contraste a la imagen...
Hola!!!
Tiene que ser mi aplicación quien lo haga. De todas formas, como veo que es complicado hacerlo, es posible que no lo haga o que busque otra solución.
Gracias y saludes!!!
Título: Re: Guardar Bitmaps Con Contraste U Opacidad
Publicado por: JuanK en Jueves 13 de Diciembre de 2007, 15:13
pues si quieres hacerlo ... adelante...

paso 1: los algoritmos de contraste y brillo:

http://www.developerfusion.co.uk/show/5441/ (http://www.developerfusion.co.uk/show/5441/)
http://www.developerfusion.co.uk/show/5441/3/ (http://www.developerfusion.co.uk/show/5441/3/)

paso2: has la implementación...


puedes hacerla usando punteros en contextos unsafe... tal como te lo propusieron en msdn o mejor aun puedes usar Bitmap.Lockbits y Marshal
Título: Re: Guardar Bitmaps Con Contraste U Opacidad
Publicado por: kalixe985 en Viernes 14 de Diciembre de 2007, 17:55
Hola!!!
Al final he encontrado una forma de hacerlo:

" Lo que estas buscando son las matrices de transformación de color, estas matrices te permiten trasladar o escalar la información de color de una imagen.

Una matriz de transformación esta compuesta de una matriz de 5x5 puntos definidos como floats, siendo su distribución esta:


Código: Text
  1. float[][] colorMatrixPoints = new float[][] {
  2.  
  3.                 new float[]{r,  0,   0,   0,  0},
  4.                 new float[]{0,  g,   0,  0,  0},
  5.                 new float[]{0,  0,   b,  0,  0},
  6.                 new float[]{0,  0,   0,  a,  0},
  7.                 new float[]{t1, t2, t3, t4, 1}
  8.  
  9.             };
  10.  


Los valores r,g,b y a son los multiplicadores de color que nos permiten escalar los colores, por ejemplo, si ponemos 0.5 en el canal r y aplicamos la matriz sobre una imagen con un valor de rojo de 0.2 esta se nos quedaría en 0.1 (los colores pueden valer entre 0 y 1 en vez de entre 0 y 255).

Los valores t1 a t4 son los valores de translación de color, en vez de multiplicar la información por el valor, este se suma al valor actual del canal especificado (t1=r, t2=g...).

Como puedes ver, cambiando los valores de r g y b haces un cambio de contraste, mientras que con t1, t2 y t3 cambias el brillo.

Una vez creada la matriz con los puntos creamos la matriz en sí y se la asignamos a un ImageAttributes que posteriormente usaremos para dibujar la imagen con los nuevos valores:


Código: Text
  1.     ColorMatrix cm = new ColorMatrix(colorMatrixPoints);
  2.     ImageAttributes imgAttr = new ImageAttributes();
  3.     imgAttr.SetColorMatrix(cm);
  4.  

Ahora solo nos queda dibujar la imagen original en una nueva imagen aplicandole el ImageAttributes que hemos creado previamente:


Código: Text
  1.  //Se supone que la imagen original está cargada en un Bitmap llamado Source
  2.     Bitmap bmpdest = new Bitmap(Source.Width, Source.Height, Source.PixelFormat);
  3.     Graphics g = Graphics.FromImage(bmpdest);
  4.     g.DrawImage(Source, new Rectangle(Point.Empty, bmpdest.Size), 0, 0, Source.Width, Source.Height, GraphicsUnit.Pixel, imgAttr);
  5.     g.Dispose();
  6.     imgAttr.Dispose();
  7.  

Y con esto ya tienes tu imagen lista para salvar con el contraste y el brillo modificado.
DR GUSMAN.  "


Gracias y saludos!!!
Título: Re: Guardar Bitmaps Con Contraste U Opacidad
Publicado por: JuanK en Viernes 14 de Diciembre de 2007, 18:53
buenisimo!
interesante averiguar algo del trasfondo.