Cómo: Recortar colores
El recorte aumenta o disminuye un componente de color en una cantidad proporcional a otro componente de color. Pongamos, por ejemplo, la transformación en la que el componente rojo se incrementa en la mitad del valor del componente azul. Con dicha transformación, el color (0.2, 0.5, 1) se convertiría en (0.7, 0.5, 1). El nuevo componente rojo es 0,2 + (1/2)(1) = 0,7.
Ejemplo
En el siguiente ejemplo se crea un objeto Image a partir del archivo ColorBars4.bmp. A continuación, el código aplica la transformación de recorte descrita en el párrafo anterior a cada píxel de la imagen.
En la siguiente ilustración se muestra la imagen original a la izquierda y la imagen sesgada a la derecha.
La siguiente tabla recoge los vectores de color de las cuatro barras antes y después de la transformación de recorte.
Original |
Recorte |
---|---|
(0, 0, 1, 1) |
(0.5, 0, 1, 1) |
(0.5, 1, 0.5, 1) |
(0.75, 1, 0.5, 1) |
(1, 1, 0, 1) |
(1, 1, 0, 1) |
(0.4, 0.4, 0.4, 1) |
(0.6, 0.4, 0.4, 1) |
Dim image = New Bitmap("ColorBars.bmp")
Dim imageAttributes As New ImageAttributes()
Dim width As Integer = image.Width
Dim height As Integer = image.Height
Dim colorMatrixElements As Single()() = _
{New Single() {1, 0, 0, 0, 0}, _
New Single() {0, 1, 0, 0, 0}, _
New Single() {0.5F, 0, 1, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}}
Dim colorMatrix As New ColorMatrix(colorMatrixElements)
imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, _
ColorAdjustType.Bitmap)
e.Graphics.DrawImage(image, 10, 10, width, height)
e.Graphics.DrawImage(image, New Rectangle(150, 10, width, height), 0, 0, _
width, height, GraphicsUnit.Pixel, imageAttributes)
Image image = new Bitmap("ColorBars.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;
float[][] colorMatrixElements = {
new float[] {1, 0, 0, 0, 0},
new float[] {0, 1, 0, 0, 0},
new float[] {0.5f, 0, 1, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {0, 0, 0, 0, 1}};
ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
imageAttributes.SetColorMatrix(
colorMatrix,
ColorMatrixFlag.Default,
ColorAdjustType.Bitmap);
e.Graphics.DrawImage(image, 10, 10, width, height);
e.Graphics.DrawImage(
image,
new Rectangle(150, 10, width, height), // destination rectangle
0, 0, // upper-left corner of source rectangle
width, // width of source rectangle
height, // height of source rectangle
GraphicsUnit.Pixel,
imageAttributes);
Compilar el código
El ejemplo anterior está diseñado para formularios Windows Forms y requiere PaintEventArgs e, que es un parámetro del controlador del evento Paint. Reemplace ColorBars.bmp por un nombre de imagen y una ruta de acceso válidos en el sistema.