|
皆さん回答ありがとうございます
減算ということで
白の用紙と黄色の用紙の色の差分をとって
画像から算出した差を引いてみました。
差分の色 = 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();
}
|