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

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

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

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

Q&A

解決済

1回答

7901閲覧

C#で、pngの透明の色処理の基本について教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2016/01/12 05:27

編集2016/01/12 06:08

C#で、pngの透明の色処理の基本について教えてください。

Windows7 Pro, Visual Studio 2013 Expressの組み合わせで、Formアプリケーションを作っています。このなかで、周囲(角)が透明であるアイコン風のpngファイルの画像の透明部分のRGBを処理しようと考えています。

Image.image = new Bitmap(pngpath);
Bitmap bitmap = (Bitmap)image;
string line = "";
for (int width = 0; width < bitmap.Width; width++)
line += colorRGB(bitmap.GetPixel(width, 10))+ "\r\n";

private string colorRGB(Color color) {
string[] cells = color.ToString().Replace("Color", "").Replace("[", "").Replace("]", "").Split(',');
return cells[1].Trim() + "," + cells[2].Trim() + "," + cells[3].Trim()+ "\t";
}

これで取得したところ、
R=33,G=40,B=0
R=33,G=40,B=0
R=33,G=40,B=0
R=33,G=40,B=0
R=33,G=40,B=0
R=36,G=43,B=0
R=17,G=30,B=18
R=38,G=48,B=50
R=39,G=50,B=52
R=39,G=50,B=52
R=39,G=50,B=52
R=30,G=41,B=43
というようなデータを取得できました。

ところが実際の画像を拡大して、colorpickerで見たところ、
Pixcel(0, 10)のRGBは、
R=99,G=104,B=76
でなければならず、1ピクセル分飛ばして作業しているようです。

Q1) なぜ1pixcelめを飛ばしてしまうのでしょう?

角のRGBをcolorpickerで見ると、
R=255, G=255, B=255
でした。

Q2) R=255, G=255, B=255は白だと思うのですが、白と透明はC#ではどう区別すればよいのでしょう。

以上、よろしくお願いします。

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

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

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

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

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

KoichiSugiyama

2016/01/12 06:03

colorRGB()関数は独自に定義した関数ですか?ちょっと調べましたがそれらしき関数が.NETには無いようなのですが。そのソースコードがあれば掲載していただくと回答が集まりやすいと思います。
退会済みユーザー

退会済みユーザー

2016/01/12 06:07

失礼しました。 追記しました。
guest

回答1

0

ベストアンサー

Q1) なぜ1pixcelめを飛ばしてしまうのでしょう?

飛ばしていません。アルファチャンネルを持った画像データは実際に描画される際に同じ色になるとは限りません。

Q2) R=255, G=255, B=255は白だと思うのですが、白と透明はC#ではどう区別すればよいのでしょう。

アルファチャンネルで透け具合を表現します。アルファ値が0なら透明ということになります。

透明・半透明を表現するために、RGB各色の要素に加えて透け具合を表す「アルファチャンネル」という要素があり、それを含めて「RGBA」と表現しています(ARGBなどと表現することもあります)。透け具合(透明度・あるいは不透明度)をアルファ値と呼んだりしますが、RGB各色を0~255で表現する場合、アルファ値も0~255で表現されることが多く、0の時は透明(背景色を表示)、255では不透明となります。
つまり、アルファチャンネルを含んだ画像が実際に描画される色は背景の影響を受けます。

ちなみに、画像データの色を前景色、アルファ値をα、背景の色を背景色とすると、実際に表示される色は以下の計算式で求まります。※少数切り捨て。ただし、すべての描画処理がこの式とは限りません。

表示色 = 前景色α/255 + 背景色(255-α)/255

ところが実際の画像を拡大して、colorpickerで見たところ、
Pixcel(0, 10)のRGBは、
R=99,G=104,B=76
でなければならず、1ピクセル分飛ばして作業しているようです。

逆算すれば、アルファ値が179であれば、RGB:33,40,0の色をRGB:255,255,255の背景に描画したときの色はRGB:99,104,76となります。

投稿2016/01/12 06:19

catsforepaw

総合スコア5938

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

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

退会済みユーザー

退会済みユーザー

2016/01/12 06:32

なるほど。 Aがわからなくて読み飛ばしていましたが、 private string colorRGB(Color color) { string[] cells = color.ToString().Replace("Color", "").Replace("[", "").Replace("]", "").Split(','); return cells[0].Trim() +","+ cells[1].Trim() + "," + cells[2].Trim() + "," + cells[3].Trim() + "\t"; } としたところ、 A=179,R=33,G=40,B=0 A=255,R=33,G=40,B=0 A=255,R=33,G=40,B=0 A=255,R=33,G=40,B=0 A=255,R=33,G=40,B=0 A=255,R=36,G=43,B=0 と値を取れ、1pixcelめが A=179,R=33,G=40,B=0 であると理解できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問