C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 色の合成


(過去ログ 76 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■44767 / inTopicNo.1)  色の合成
  
□投稿者/ ぽん (1回)-(2009/12/17(Thu) 14:14:35)

分類:[.NET 全般] 

Visual C# 2008 Express Editionで画像の印刷アプリケーションを作成しています。

印刷イメージのプレビュー時に用紙が白の場合はいいのですが、
白以外の場合は印刷イメージと違ってしまいます。

プリンターはCMYKでディスプレイ上はRGBだと知っていますが
どのように色を合成すれば、印刷時と同じようなイメージに出きるのでしょうか?
(プレビュー専用の画像を作成したい)

例)黄色の用紙に画像を印刷した場合、白色は印刷されないので
プレビュー上で黄色で表示したい。また、その他の色も用紙の色に影響されて
違う色に見えるようにしたい。


画像からピクセル単位で色を取得する方法は分かっているのですが
どのような計算で色を算出すればいいのかが分かりません。



引用返信 編集キー/
■44770 / inTopicNo.2)  Re[1]: 色の合成
□投稿者/ こあら (62回)-(2009/12/17(Thu) 15:36:28)
とりあえず「加算合成」というのがキーワードになりそうでしたよ。
http://www.google.co.jp/search?q=%90F+%8D%87%90%AC


> どのような計算で色を算出すればいいのかが分かりません。

元の色をRGBに分解して、RとG(黄色)を加算してやれば良さそう。
加算する割合は、紙の色とか印刷の質とかで変わってきそうな気がします。
やってみて、ちょうど良い(妥協できる)感じになる割合を探すしかないかも。

引用返信 編集キー/
■44777 / inTopicNo.3)  Re[2]: 色の合成
□投稿者/ ぽん (3回)-(2009/12/17(Thu) 17:30:46)
こあらさん
回答ありがとうございます。

> 元の色をRGBに分解して、RとG(黄色)を加算してやれば良さそう。
> 加算する割合は、紙の色とか印刷の質とかで変わってきそうな気がします。
> やってみて、ちょうど良い(妥協できる)感じになる割合を探すしかないかも。

だいたい、この様な色になりますと言うのが表現できればと
思っています。


黄色の用紙の色を画面上で表現すると

R 255 G 255 B 0

画像の白を画面上で表現すると

R 255 G 255 B 255


両方足すと画面上では白色になってしまいます。
逆に引くのかと思いやって見ましたが
黄から白を引くと黒になり、
白から黄色を引くと青になります。

白色を透過色に指定してやっても見たのですが
R 200 G 200 B 200の白っぽい色は当然無視されてしまいます。



引用返信 編集キー/
■44778 / inTopicNo.4)  Re[3]: 色の合成
□投稿者/ .SHO (1056回)-(2009/12/17(Thu) 17:36:49)
No44777 (ぽん さん) に返信

> 両方足すと画面上では白色になってしまいます。
> 逆に引くのかと思いやって見ましたが
> 黄から白を引くと黒になり、
> 白から黄色を引くと青になります。

単純に足して半分にすればいいんでない?
引用返信 編集キー/
■44779 / inTopicNo.5)  Re[3]: 色の合成
□投稿者/ επιστημη (2321回)-(2009/12/17(Thu) 17:38:16)
επιστημη さんの Web サイト
>>元の色をRGBに分解して、RとG(黄色)を加算してやれば良さそう。

この場合加色混合じゃなく減色混合ちゃいます? 混ぜれば混ぜるほど暗くなるから。
http://www.krcom.co.jp/color-story/komoku2.html
引用返信 編集キー/
■44780 / inTopicNo.6)  Re[4]: 色の合成
□投稿者/ こあら (63回)-(2009/12/17(Thu) 17:59:47)
No44779 (επιστημη さん) に返信
> >>元の色をRGBに分解して、RとG(黄色)を加算してやれば良さそう。
>
> この場合加色混合じゃなく減色混合ちゃいます? 混ぜれば混ぜるほど暗くなるから。
> http://www.krcom.co.jp/color-story/komoku2.html

そっか。最初に「白地を黄色くしたい」って書いてありましたね。
ということは、RとG(黄色)を加算するのではなく、
(RとG(黄色)を残すために)Bを減算すれば良いということでしょうかね。

と何と言うかリンク先の、しずくちゃん?あれはヤバいです。

「よくわかんないよっ」じたばたじたばた

引用返信 編集キー/
■44781 / inTopicNo.7)  Re[5]: 色の合成
□投稿者/ επιστημη (2322回)-(2009/12/17(Thu) 18:12:57)
επιστημη さんの Web サイト
> ということは、RとG(黄色)を加算するのではなく、
> (RとG(黄色)を残すために)Bを減算すれば良いということでしょうかね。

んー、きっちりやるなら RGB→CMYKに変換→黄色を加えて→RGBに戻す のかしら。

「よくわかんないよっ」じたばたじたばた

引用返信 編集キー/
■44784 / inTopicNo.8)  Re[1]: 色の合成
□投稿者/ Jitta on the way (489回)-(2009/12/17(Thu) 19:14:47)
んー?
黄色い用紙に赤い(マゼンタの)インクを落とすと、「赤」なんだろうか?それとも、オレンジなんだろうか?

インクを飛ばさない所を、指定の色に置き換える、じゃないだろうか?
引用返信 編集キー/
■44799 / inTopicNo.9)  Re[2]: 色の合成
□投稿者/ なちゃ (345回)-(2009/12/17(Thu) 23:37:26)
理屈的には地の髪の色の補色を減算ですかね?
まあもともと印刷物の色は照明で変わるので基準が必要ですが、
細かいところをおいとくなら、
地の紙の色をRGBで求めて(決めて)、
本来のRGB値から255を引いて紙のRGBを加算ですね。

紙が
R 255 G 255 B 0
ということなら、
Bを0にするだけです、計算上(理屈の上)では。

引用返信 編集キー/
■44801 / inTopicNo.10)  Re[3]: 色の合成
□投稿者/ なちゃ (346回)-(2009/12/17(Thu) 23:42:07)
考え方としては、「紙の色」の代わりに「照明の色」と考えると分かりやすくなるかも。
照明の色が
R 255 G 255 B 0
なら結果がどうなるかは明らかですね。
青が点かないというのと同じことです。

引用返信 編集キー/
■44802 / inTopicNo.11)  Re[4]: 色の合成
□投稿者/ なちゃ (347回)-(2009/12/17(Thu) 23:50:54)
ちょっと追加
>理屈的には地の髪の色の補色を減算ですかね?
って書きましたが、計算の意味としては正確には地の色の明るさを乗算ですかね…
※今回のように255か0かなら同じ結果になりますが。

本来の色*地の色/255
かな。

引用返信 編集キー/
■44808 / inTopicNo.12)  Re[5]: 色の合成
□投稿者/ ぽん (4回)-(2009/12/18(Fri) 09:47:25)
皆さん回答ありがとうございます

減算ということで
白の用紙と黄色の用紙の色の差分をとって
画像から算出した差を引いてみました。

差分の色 = RGB(255,255,255) - RGB(255,255,0)

変換された色 = 画像の色 - 差分の色(0,0,255)


この様にすると画像から青の成分がすべて消えてしまいました^^;
まぁ、青の成分255を引いてるから当たり前ですね



> ちょっと追加
> >理屈的には地の髪の色の補色を減算ですかね?
> って書きましたが、計算の意味としては正確には地の色の明るさを乗算ですかね…
> ※今回のように255か0かなら同じ結果になりますが。
> 
> 本来の色*地の色/255
> かな。

なるほど、単純に引くだけじゃ駄目なんですね

一応完成したのでソースをUPしておきます。
GetPixelとSetPixelは遅いので実際はunsafeを利用したものに
置き換えています。

-----------------------------------------------------------

        Bitmap _drawImage = new Bitmap(800, 600);
        Point _drawImagePoint = new Point();

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(_drawImage, _drawImagePoint);
        }


        private void button1_Click(object sender, EventArgs e)
        {

            Bitmap targetBmp = new Bitmap("テスト画像.png");
            Color targetColor = Color.Empty; //画像から取得した色
            Color setColor = Color.Empty;    //新しくセットする色
            Color backColor = Color.FromArgb(255, 255, 0); ;  //背景の色(用紙)
            float roundValue = 0.5f;//四捨五入の補正用

            Graphics g = Graphics.FromImage(_drawImage);
            g.Clear(backColor);


            int red, blue, green;

            for (int x = 0; x < targetBmp.Width; x++)
            {
                for (int y = 0; y < targetBmp.Height; y++)
                {
                    targetColor = targetBmp.GetPixel(x, y);

                    red = (int)(targetColor.R * backColor.R / 255 + roundValue);
                    green = (int)(targetColor.G * backColor.G / 255 + roundValue);
                    blue = (int)(targetColor.B * backColor.B / 255 + roundValue);

                    setColor = Color.FromArgb(red, green, blue);

                    targetBmp.SetPixel(x, y, setColor);
                }
            }

            g.DrawImage(targetBmp, _drawImagePoint);
            g.Dispose();

            panel1.Refresh();

        }

解決済み
引用返信 編集キー/
■44810 / inTopicNo.13)  Re[6]: 色の合成
□投稿者/ なちゃ (348回)-(2009/12/18(Fri) 10:44:04)
理屈の上ではとか計算上はと書いたとおり、実際の紙とインクでは計算通りの色にはなりません。
だからプリンターメーカーも上手く色がでるようにインクなどを調整するわけで、
結局単純な計算で本当に再現するのは無理があります。

現実的には、例え黄色の紙でも青成分が完全にゼロにはならないでしょうし、
例え紙の青成分がゼロでも、インク自体の反射で多少は青成分も出てくるはずです。

なので、青成分も完全にゼロではなく、ある程度乗せる方が現実の色感には近くなると思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -