質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

3988閲覧

C#で表示した画像のRGBを補正したいです。

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/12/02 07:28

こんにちは。
Windows10でC#, Formのアプリケーションを開発しています。
Visual Studio 2015 Communityを使っています。

###前提・実現したいこと
表示した画像のRGBを補正したいです。

###試したこと
rScale, gScale, bScaleの最小値と中央値(元の色になる値?)、最大値を知りたいです。それをSliderに実装するにはどのように値をとればよいでしょう?
実際に、いくつか値を入れてみました。

rScale=0, gScale=0, bScale=0とすると黒くなるので最小値は0だと思います。
rScale=1, gScale=1, bScale=1とするともとに色になるので中央値は1だと思います。
しかし、
rScale=256, gScale=256, bScale=256としても真っ白になりません。
rScale=2560, gScale=2560, bScale=2560としても真っ白になりません。

###疑問点
表示した画像のRGBを補正するための、
Q1)最大値を知りたいです。
Q2)なぜ真っ白にならないのでしょう? 黄色い輪郭線が残ります。
Q3)0-1-256としたとき、これをスライダーで、中央が1になるようにするには、どのような数式を用いて変換したらよいですか?

###該当のソースコード

C#

1 public static Image CreateColorCorrectedImage(Image img, 2 float rScale, float gScale, float bScale) 3 { 4 //補正した画像の描画先となるImageオブジェクトを作成 5 Bitmap newImg = new Bitmap(img.Width, img.Height); 6 //newImgのGraphicsオブジェクトを取得 7 Graphics g = Graphics.FromImage(newImg); 8 9 //ColorMatrixオブジェクトの作成 10 //指定された倍率を掛けるための行列を指定する 11 System.Drawing.Imaging.ColorMatrix cm = 12 new System.Drawing.Imaging.ColorMatrix( 13 new float[][] { 14 new float[] {rScale, 0, 0, 0, 0}, 15 new float[] {0, gScale, 0, 0, 0}, 16 new float[] {0, 0, bScale, 0, 0}, 17 new float[] {0, 0, 0, 1, 0}, 18 new float[] {0, 0, 0, 0, 1} 19 }); 20 21 //ImageAttributesオブジェクトの作成 22 var ia = new System.Drawing.Imaging.ImageAttributes(); 23 //ColorMatrixを設定する 24 ia.SetColorMatrix(cm); 25 26 //ImageAttributesを使用して描画 27 g.DrawImage(img, 28 new Rectangle(0, 0, img.Width, img.Height), 29 0, 0, img.Width, img.Height, GraphicsUnit.Pixel, ia); 30 31 //リソースを解放する 32 g.Dispose(); 33 34 return newImg; 35 } 36

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2015
Version 14.0.25424.00 Update 3
Microsoft .NET Framework
Version 4.6.01038

インストールしているバージョン:Community

Visual C# 2015 00322-20000-00000-AA575
Microsoft Visual C# 2015

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

http://dobon.net/vb/dotnet/graphics/colorbalance.html
LockBitsメソッドを使用しました。

投稿2016/12/02 09:46

cancat

総合スコア313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

CreateColorCorrectedImageについては、下記のページで開設されていますから、よく読んでください。

画像のカラーバランスを補正して表示する

CreateColorCorrectedImageは、色ごとに指定された倍率(rScale,gScale,bScale)を掛ける事で補正した画像を返すルーチンです。
元の画像の全てのピクセルのRGBの値に0が含まれていなければ、rScale=2560, gScale=2560, bScale=2560というような大きな倍率を指定する事で、真っ白な画像が返されるでしょう。

しかし、黒(0,0,0)、赤(255,0,0)、緑(0,255,0)、青(0,0,255)のピクセルに大きな倍率を掛けても、元のままになります。 0に何を掛けても0にしかなりませんし、255より大きな値になっても255が上限だからです。
他にもRGBの値に0が含まれているピクセルでは、ごく薄い赤(1,0,0)が濃い赤(255,0,0)しかならない等して白になりません。

投稿2016/12/02 08:07

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問