我试图写一个函数,可以让我的红移或同时保持图像的整体亮度蓝移位图。基本上,完全红移的位图将具有与原始相同的亮度,但是会被彻底地重新着色(即,对于所有像素,G和B值将是相等的)。蓝色相同(但R和G相等)。频谱搬移的程度需要从预先0到1更改位图的色调,同时保持整体亮度
由于变化。
我试图写一个函数,可以让我的红移或同时保持图像的整体亮度蓝移位图。基本上,完全红移的位图将具有与原始相同的亮度,但是会被彻底地重新着色(即,对于所有像素,G和B值将是相等的)。蓝色相同(但R和G相等)。频谱搬移的程度需要从预先0到1更改位图的色调,同时保持整体亮度
由于变化。
这里是我一直在寻找(蹩脚JPEG,对不起)效果:
alt text http://www.freeimagehosting.net/uploads/d15ff241ca.jpg
在中间的图像是原始的,并且侧图像是完全红移,部分红 - 分别移位,部分蓝移和完全蓝移。
这里是产生这种效果的功能:
public void RedBlueShift(Bitmap bmp, double factor)
{
byte R = 0;
byte G = 0;
byte B = 0;
byte Rmax = 0;
byte Gmax = 0;
byte Bmax = 0;
double avg = 0;
double normal = 0;
if (factor > 1)
{
factor = 1;
}
else if (factor < -1)
{
factor = -1;
}
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color color = bmp.GetPixel(x, y);
R = color.R;
G = color.G;
B = color.B;
avg = (double)(R + G + B)/3;
normal = avg/255.0; // to preserve overall intensity
if (factor < 0) // red-tinted:
{
if (normal < .5)
{
Rmax = (byte)((normal/.5) * 255);
Gmax = 0;
Bmax = 0;
}
else
{
Rmax = 255;
Gmax = (byte)(((normal - .5) * 2) * 255);
Bmax = Gmax;
}
R = (byte)((double)R - ((double)(R - Rmax) * -factor));
G = (byte)((double)G - ((double)(G - Gmax) * -factor));
B = (byte)((double)B - ((double)(B - Bmax) * -factor));
}
else if (factor > 0) // blue-tinted:
{
if (normal < .5)
{
Rmax = 0;
Gmax = 0;
Bmax = (byte)((normal/.5) * 255);
}
else
{
Rmax = (byte)(((normal - .5) * 2) * 255);
Gmax = Rmax;
Bmax = 255;
}
R = (byte)((double)R - ((double)(R - Rmax) * factor));
G = (byte)((double)G - ((double)(G - Gmax) * factor));
B = (byte)((double)B - ((double)(B - Bmax) * factor));
}
color = Color.FromArgb(R, G, B);
bmp.SetPixel(x, y, color);
}
}
}
咦?为什么有人会对此答案投下赞成票? – MusiGenesis 2010-06-12 01:56:17
我可以想象这个代码非常慢,因为它使用每像素操作。 Hans Passant建议,我会研究ColorMatrix类。 – 2011-06-13 14:02:08
@Will Kru:是的,由于'GetPixel'和'SetPixel',我发布的代码会超级慢。但是,ColorMatrix不适合我,因为我的“位图”并不是真正的.NET位图 - 它们是2D“int”数组。我包含的函数使用.NET位图和GetPixel/SetPixel,以便其他人更有用。 – MusiGenesis 2011-06-13 19:33:27
你会使用ColorMatrix类。在this project有一个很好的教程。
会改变颜色空间,HSV,然后转移色相你在找什么? – 2010-02-27 15:45:18
单纯疱疹病毒会有点工作,但不完全一样。 – MusiGenesis 2010-02-27 15:58:10
听起来像你想要的是一个特定颜色的“灰度”图像,这是正确的吗? – 2010-02-27 21:14:15