次の方法で共有


変換を使用した色のスケーリング

更新 : 2007 年 11 月

スケーリング変換では、4 つの色要素のうちの 1 つ以上の要素に数値を掛け合わせます。スケーリングを表すカラー行列エントリを次の表に示します。

スケーリング対象の要素

行列エントリ

[0][0]

[1][1]

[2][2]

アルファ

[3][3]

単一色のスケーリング

ファイル ColorBars2.bmp から Image オブジェクトを構築する例を次に示します。このコードは、次に、イメージ内の各ピクセルの青の要素を係数 2 でスケーリングします。元のイメージと変換後のイメージが並んで描画されます。

Dim image As New Bitmap("ColorBars2.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, 0, 2, 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)

' Pass in the destination rectangle (2nd argument), the upper-left corner 
' (3rd and 4th arguments), width (5th argument),  and height (6th 
' argument) of the source rectangle.
e.Graphics.DrawImage( _
   image, _
   New Rectangle(150, 10, width, height), _
   0, 0, _
   width, _
   height, _
   GraphicsUnit.Pixel, _
   imageAttributes)

Image image = new Bitmap("ColorBars2.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,  0,  2,  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);

次の図は、左側に元のイメージ、右側にスケーリングされたイメージを示しています。

スケールの色

青のスケーリングを実行する前後の 4 つのバーのカラー ベクタを次の表に示します。4 番目のカラー バーの青の要素は、0.8 から 0.6 になっています。その理由は、GDI+ が結果値の小数部だけを保持するためです。たとえば、(2)(0.8) = 1.6 の場合、1.6 の小数部は 0.6 になります。小数部だけを保持することによって、結果値が必ず [0, 1] の間隔内に収まるようにしています。

変換前

変換後

(0.4, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.2, 0.2, 1)

(0.4, 0.2, 0.4, 1)

(0.2, 0.4, 0.2, 1)

(0.2, 0.4, 0.4, 1)

(0.4, 0.4, 0.8, 1)

(0.4, 0.4, 0.6, 1)

複数の色のスケーリング

ファイル ColorBars2.bmp から Image オブジェクトを構築する例を次に示します。このコードは、次に、イメージ内の各ピクセルの赤、緑、青の各要素をスケーリングします。赤の要素は 25%、緑の要素は 35%、青の要素は 50% 縮小されます。

Dim image As 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() {0.75F, 0, 0, 0, 0}, _
   New Single() {0, 0.65F, 0, 0, 0}, _
   New Single() {0, 0, 0.5F, 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)

' Pass in the destination rectangle, and the upper-left corner, width, 
' and height of the source rectangle as in the previous example.
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[] {.75F,  0,  0,  0, 0},
   new float[] {0,  .65F,  0,  0, 0},
   new float[] {0,  0,  .5F,  0, 0},
   new float[] {0,  0,  0,  1F, 0},
   new float[] {0, 0, 0, 0, 1F}};

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

次の図は、左側に元のイメージ、右側にスケーリングされたイメージを示しています。

スケールの色

赤、緑、および青のスケーリングを実行する前後の 4 つのバーのカラー ベクタを次の表に示します。

変換前

変換後

(0.6, 0.6, 0.6, 1)

(0.45, 0.39, 0.3, 1)

(0, 1, 1, 1)

(0, 0.65, 0.5, 1)

(1, 1, 0, 1)

(0.75, 0.65, 0, 1)

(1, 0, 1, 1)

(0.75, 0, 0.5, 1)

参照

参照

ColorMatrix

ImageAttributes

その他の技術情報

Windows フォームにおけるグラフィックスと描画

イメージの色の変更