Sdílet prostřednictvím


Postupy: Použití matice barev k transformaci jedné barvy

GDI+ poskytuje Image a Bitmap třídy pro ukládání a manipulaci s obrázky. Image a Bitmap objekty ukládají barvu každého pixelu jako 32bitové číslo: 8 bitů pro červenou, zelenou, modrou a alfa. Každá ze čtyř složek je číslo od 0 do 255, přičemž 0 představuje žádnou intenzitu a 255 představuje plnou intenzitu. Alfa komponenta určuje průhlednost barvy: 0 je plně průhledná a 255 je plně neprůhledná.

Barevný vektor je čtveřice ve tvaru (červená, zelená, modrá, alfa). Například barevný vektor (0, 255, 0, 255) představuje neprůhlenou barvu, která nemá červenou nebo modrou, ale má zelenou v plné intenzitě.

Další konvence pro reprezentaci barev používá číslo 1 pro plnou intenzitu. Použitím této konvence by byla barva popsaná v předchozím odstavci reprezentována vektorem (0, 1, 0, 1). GDI+ používá konvenci 1 jako plnou intenzitu při provádění barevných transformací.

U barevných vektorů můžete použít lineární transformace (otočení, měřítko a podobně) vynásobením barevných vektorů maticí 4×4. Nelze však použít 4×4 matici k provedení překladu (nelineární). Pokud ke každému barevnému vektoru přidáte fiktivní pátou souřadnici (například číslo 1), můžete pomocí matice 5×5 použít libovolnou kombinaci lineárních transformací a překladů. Transformace skládající se z lineární transformace následované překladem se nazývá affinová transformace.

Předpokládejme například, že chcete začít barvou (0.2, 0.0, 0.4, 1.0) a použít následující transformace:

  1. Zdvojnásobte červenou složku

  2. Přidejte 0,2 k červeným, zeleným a modrým komponentám.

Následující násobení matice provede dvojici transformací v uvedeném pořadí.

Snímek obrazovky s násobením transformace

Prvky barevné matice se indexují (založené na nule) podle řádku a potom sloupce. Například položka v pátém řádku a třetím sloupci matice M je označena M[4][2].

Matice identit 5×5 (znázorněná na následujícím obrázku) má 1s na diagonále a 0s všude jinde. Pokud vynásobíte barevný vektor maticí identity, barevný vektor se nezmění. Pohodlný způsob, jak vytvořit matici transformace barev, je začít s maticí identity a provést malou změnu, která vytváří požadovanou transformaci.

Snímek obrazovky s maticí identit 5x5 pro transformaci barev

Podrobnější informace o maticích a transformacích najdete v tématu souřadnicových systémů a transformací.

Příklad

Následující příklad vezme obrázek, který je všechny barvy (0.2, 0.0, 0.4, 1.0) a použije transformaci popsanou v předchozích odstavcích.

Následující obrázek znázorňuje původní obrázek vlevo a transformovaný obrázek vpravo.

Fialový čtverec vlevo a na pravé straně je čtverec fuchsia.

Kód v následujícím příkladu používá k přebarvení následující kroky:

  1. Inicializace objektu ColorMatrix

  2. Vytvořte ImageAttributes objekt a předejte ColorMatrix objekt metodě SetColorMatrix objektu ImageAttributes .

  3. ImageAttributes Předejte objekt metodě DrawImage objektuGraphics.

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);
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)

Kompilace kódu

Předchozí příklad je určen pro použití s Windows Forms a vyžaduje PaintEventArgse, což je parametr obslužné rutiny události Paint.

Viz také