- ベストアンサー
C#で画像の色を変更するプログラムがうまく動かない
- C#のプログラムで、openFileDialogで画像を読み取り、その画像の黒色を白色に変更してpictureBoxに表示するプログラムを作成していますが、色が変更されません。
- プログラムの中で、ColorMapを使用して黒色を白色に変換していますが、うまくいかないようです。
- 問題が発生している箇所を特定することができず、解決策がわからない状況です。助けていただける方がいらっしゃいましたら、ご教示いただければと思います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
色の比較が Color.Blackではうまくいかない場合があるようです if ( img.GetPixel(x,y) == Color.FromaArgb(255,0,0,0) ) といった具合のほうがいいようです … 当方が実験したコードを記載します Bitmap bmp = new Bitmap(255, 255); Graphics g1; g1 = Graphics.FromImage(bmp); pictureBox1.Image = null; // リニアグラデーションブラシで 黒からシアンを作成 LinearGradientBrush br = new LinearGradientBrush( new Point(0, 128), new Point(255, 128), Color.FromArgb(0, 0,0), Color.FromArgb(0, 255,255)); // 矩形を描画 g1.FillRectangle(br, new Rectangle(0, 0, 255, 255)); // シアンの円を2つ描画 g1.FillEllipse(new SolidBrush(Color.FromArgb(0, 128, 128)), new Rectangle(20, 20, 180, 180)); g1.FillEllipse(new SolidBrush(Color.FromArgb(0, 255, 255)), new Rectangle(40, 40, 140, 140)); g1.Dispose(); bmp.Save("sample01.jpg"); ImageAttributes ia = new ImageAttributes(); // 閾値を0.7にしてマスクを作成 ia.SetThreshold(0.7F); Bitmap img = (Bitmap)Bitmap.FromFile("sample01.jpg"); g1 = Graphics.FromImage(img); g1.DrawImage(img, new Rectangle(0, 0, 255, 255), 0, 0, 255, 255, GraphicsUnit.Pixel, ia); g1.Dispose(); pictureBox1.Image = img; img.Save("Sample02.jpg"); for (int y = 0; y < img.Height; y++) { for (int x = 0; x < img.Width; x++) { // マスクをチェック if (img.GetPixel(x, y) == Color.FromArgb(255,0,0,0)) { bmp.SetPixel(x, y, Color.White); } } } pictureBox2.Image = bmp; bmp.Save("sample03.jpg"); } といった具合です
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
マスク画像を作成してこれを使って BitmapのGetPixel/SetPixelで処理かなぁ # もっとスマートなやり方があると思いますが … ImageAttributes Ia = new ImageAttributes(); Ia.SetThreshold(0.7F); g.DrawImage( img, new Rectatngle( 0, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia ); g.Dispose(); for( y = 0; y < img.Height; y++ ) { for ( x = 0; x < img.Width; x++ ) { if ( img.GetPixel( x, y ) == Color.Black ) { bmp.SetPixel( x, y, Color.White ); } } } といった具合かなぁ …
補足
回答ありがとうございます。 記述とおり、プログラムしてみたのですが、 色が薄くなっただけで、黒色が白色には変わりませんでした。 どうしたらよろしいでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
一部訂正 Bitmap bmp = new Bitmap( img.Width * 2 + 20, img.Height ); でした
補足
回答ありがとうございます。 web上の画像を保存し、それを読み込んで色変換することは出来ました。 しかし、スキャンした画像を読み込んで、色の変更をしようとすると、 スキャンした画像の色が同じ黒でもRGBが違っていて、 cms[0].OldColor = Color.Black; では、判断してくれないようです。 RGBがこの範囲からこの範囲までの色を白色にしたいときは、どうすればよろしいでしょうか?
- redfox63
- ベストアンサー率71% (1325/1856)
g.DrawImageで描画している位置がおかしいと思います 元もと gを Graphics.FromImageで作成しているので img.Widthの幅しかありません img.Width + 10が左端とした場合 クリッピングされて描画自体しないでしょう 2つの描画結果得たいのであれば Bitmap bmp = new Bitmap( img.Width + 20, img.Height ); Graphics g = Graphics.FromImage( bmp ); といった具合でグラフィックスオブジェクトを作成して g.DrawImage( img, 0, 0, img.Width, img. Height ); g.DrawImage( New Rectangle( img.Width + 10, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia ); といった具合で描画しましょう
お礼
お礼遅くなって申し訳ございません。 私の場合、Color.FromArgb(255,0,0,0)では正確でないので、これでは出来ませんでした。 int P = bitmap.GetPixel(X, Y).ToArgb(); if(P == 色変更したいところのP) bitmap2.SetPixel(X, Y, Color.FromArgb(0xffffff)); else bitmap2.SetPixel(X, Y, Color.FromArgb(P)); というふうにして解決できました。 何度も回答していただき、ありがとうございました。 また、質問がでてきた際はよろしくお願いいたします。