Partilhar via


Como: Use uma matriz de cores para transformar uma única cor.

GDI+fornece a Image e Bitmap classes para armazenar e manipular imagens. Imagee Bitmap objetos armazenam a cor de cada pixel como um número de 32 bits: 8 bits cada para vermelho, verde, azul e alfa. Cada um dos quatro componentes é um número de 0 a 255, com 0 representando nenhum intensidade e 255, que representa a intensidade total. O componente alfa Especifica a transparência da cor: 0 é completamente transparente e 255 é totalmente opaco.

Um vetor de cor é uma tupla de 4 do formulário (vermelho, verde, azul, alfa). Por exemplo, o vetor de cor (0, 255, 0, 255) representa uma cor opaca que nenhum vermelho ou azul, mas tem de verde em intensidade total.

Outra convenção para representar cores usa o número 1 para a intensidade total. Usando essa convenção, a cor descrita no parágrafo anterior seria representada pelo vetor (0, 1, 0, 1). GDI+usa a convenção de 1 como intensidade total quando ele executa transformações de cor.

Você pode aplicar transformações lineares (rotação, dimensionamento e assim por diante) para os vetores de cor multiplicando os vetores de cor por uma matriz de 4 × 4. No entanto, é possível usar uma matriz de 4 × 4 para realizar uma tradução (não linear). Se você adicionar uma coordenada quinta fictícia (por exemplo, o número 1) para cada um dos vetores de cor, você pode usar uma matriz de 5 de 5 × para aplicar qualquer combinação de transformações lineares e traduções. Uma transformação que consiste em uma transformação linear seguida de uma tradução é chamada de uma transformação afim.

Por exemplo, suponha que você deseja iniciar com a cor (0.2, 0.0, 0.4, 1.0) e aplicar as transformações seguintes:

  1. Dobrar o componente vermelho

  2. Adicionar 0,2 aos componentes vermelhos, verdes e azuis

A multiplicação de matriz a seguir realizará o par de transformações na ordem listada.

Recolorindo

Os elementos de uma matriz de cores são indexados (baseado em zero) por linha e coluna. Por exemplo, a entrada na quinta linha e terceira coluna da matriz m é indicada por M [4] [2].

A matriz de identidade 5 × 5 (mostrado na ilustração a seguir) tem 1s na diagonal e outra em todos os lugares de 0s. Se você multiplicar um vetor de cor, a matriz de identidade, o vetor de cor não é alterada. Uma maneira conveniente para formar a matriz de uma transformação de cor é iniciar com a matriz de identidade e fazer uma pequena alteração que produz a transformação desejada.

Recolorindo

Para obter uma discussão mais detalhada das matrizes e transformações, consulte sistemas de coordenadas e transformações.

Exemplo

O exemplo a seguir usa uma imagem que é uma cor (0.2, 0.0, 0.4, 1.0) e aplica a transformação descrita nos parágrafos anteriores.

A ilustração a seguir mostra a imagem original, à esquerda e a imagem transformada no lado direito.

Cores

O código no exemplo a seguir usa as seguintes etapas para executar o Recolorir:

  1. Inicializar um ColorMatrix objeto.

  2. Criar um ImageAttributes object e passar a ColorMatrix o objeto para o SetColorMatrix método o ImageAttributes objeto.

  3. Passar o ImageAttributes o objeto para o DrawImage o método de um Graphics objeto.

        Dim image As New Bitmap("InputColor.bmp")
        Dim imageAttributes As New ImageAttributes()
        Dim width As Integer = image.Width
        Dim height As Integer = image.Height

        ' The following matrix consists of the following transformations:
        ' red scaling factor of 2
        ' green scaling factor of 1
        ' blue scaling factor of 1
        ' alpha scaling factor of 1
        ' three translations of 0.2
        Dim colorMatrixElements As Single()() = { _
           New Single() {2, 0, 0, 0, 0}, _
           New Single() {0, 1, 0, 0, 0}, _
           New Single() {0, 0, 1, 0, 0}, _
           New Single() {0, 0, 0, 1, 0}, _
           New Single() {0.2F, 0.2F, 0.2F, 0, 1}}

        Dim colorMatrix As New ColorMatrix(colorMatrixElements)

        imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)

        e.Graphics.DrawImage(image, 10, 10)

        e.Graphics.DrawImage( _
           image, _
           New Rectangle(120, 10, width, height), _
           0, _
           0, _
           width, _
           height, _
           GraphicsUnit.Pixel, _
           imageAttributes)

Image image = new Bitmap("InputColor.bmp");
ImageAttributes imageAttributes = new ImageAttributes();
int width = image.Width;
int height = image.Height;

float[][] colorMatrixElements = { 
   new float[] {2,  0,  0,  0, 0},        // red scaling factor of 2
   new float[] {0,  1,  0,  0, 0},        // green scaling factor of 1
   new float[] {0,  0,  1,  0, 0},        // blue scaling factor of 1
   new float[] {0,  0,  0,  1, 0},        // alpha scaling factor of 1
   new float[] {.2f, .2f, .2f, 0, 1}};    // three translations of 0.2

ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

imageAttributes.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

e.Graphics.DrawImage(image, 10, 10);

e.Graphics.DrawImage(
   image,
   new Rectangle(120, 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);

Compilando o código

O exemplo anterior é projetado para uso com o Windows Forms e requer PaintEventArgs e, que é um parâmetro da Paint manipulador de eventos.

Consulte também

Outros recursos

Recolorir imagens

Sistemas de coordenadas e transformações