色を反転させる
今回は簡単です。すぐに終わります。色を反転させる処理を行ないます。R,G,Bの要素をそれぞれ求めて255からこの値を引くと補色を得ることができます。
1 2 3 4 5 6 7 8 9 |
public partial class Form1 : Form { private void ColorReverseMenuItem_Click(object sender, EventArgs e) { bool ret = userControlImage1.ReverseColor(); if(!ret) MessageBox.Show("画像が読み込まれていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
UserControlImageクラス側では以下のような処理をおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class UserControlImage : UserControl { public bool ReverseColor() { if(Bitmap == null) return false; if(BitmapRectangle != null) UniteBitmapRectangle(new Point()); Bitmap bmp = Bitmap; int width = bmp.Width; int height = bmp.Height; Bitmap newBitmap = new Bitmap(width, height); for(int x = 0; x < width; x++) { for(int y = 0; y < height; y++) { Color color = bmp.GetPixel(x, y); int r = 255 - color.R; int g = 255 - color.G; int b = 255 - color.B; newBitmap.SetPixel(x, y, Color.FromArgb(r, g, b)); } } Bitmap = newBitmap; ShowBitmap(Bitmap); return true; } } |
選択されている部分だけ色を反転させることもできます。前回作成したGetSelectionBitmapメソッドとSetSelectionBitmapメソッドを使います。
1 2 3 4 5 6 7 8 9 10 |
public partial class Form1 : Form { private void SelectionColorReverseMenuItem_Click(object sender, EventArgs e) { bool ret = userControlImage1.ReverseColorInRectangle(); if(!ret) MessageBox.Show("画像が読み込まれていません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public partial class UserControlImage : UserControl { public bool ReverseColorInRectangle() { if(Bitmap == null) return false; if(BitmapRectangle == null) return false; Bitmap bitmap = BitmapRectangle.Bitmap; Rectangle rect = BitmapRectangle.Rectangle; Bitmap rectBitmap = new Bitmap(rect.Width, rect.Height); for(int x = 0; x < rect.Width; x++) { for(int y = 0; y < rect.Height; y++) { Color color = bitmap.GetPixel(x, y); int r = 255 - color.R; int g = 255 - color.G; int b = 255 - color.B; rectBitmap.SetPixel(x, y, Color.FromArgb(r, g, b)); } } BitmapRectangle.Bitmap = rectBitmap; Bitmap newBitmap = new Bitmap(Bitmap); Graphics graphics = Graphics.FromImage(newBitmap); Rectangle srcRect = new Rectangle(0, 0, rectBitmap.Width, rectBitmap.Height); graphics.DrawImage(rectBitmap, rect, srcRect, GraphicsUnit.Pixel); graphics.Dispose(); Bitmap = newBitmap; ShowBitmap(DrawBoderRectangle(Bitmap)); return true; } } |