我想将图像转换为黑白或深褐色。 转换图像后,我希望用转换后的图像替换现有图像。请给我一些建议。
Y = 0.299*R + 0.587*G + 0.114*B
) [v,v,v]
,请这样着色: [v * a,v * b,v * c]
,其中 0 <= a,b,c <=1
。这个链接提供了如何将图像转换为黑白而不是灰度的方法。
var color = new Bitmap("file.jpg");
var bw = color.Clone(new Rectangle(0, 0, color.Width, color.Height),
PixelFormat.Format1bppIndexed);
// Loop through the images pixels to reset color.
for(x=0; x<image1.Width; x++)
{
for(y=0; y<image1.Height; y++)
{
Color pixelColor = image1.GetPixel(x, y);
int grayScale = (int)((originalColor.R * .3) +
(originalColor.G * .59) + (originalColor.B * .11));
//create the color object
Color newColor = Color.FromArgb(grayScale, grayScale, grayScale);
image1.SetPixel(x, y, newColor);
}
}
使用此方法将彩色像素转换为灰度图像
Gray = Green * 0.59 + Blue * 0.11 + Red * 0.30;
若要转换为棕褐色,则首先需将图像转换为灰度。然后,将每个像素乘以一个固定的缩放三元组,例如[1, 0.95, 0.82]。您可以尝试修改这个三元组来得到合适的效果…… 因此代码可能如下:
for(x=0; x<image1.Width; x++)
{
for(y=0; y<image1.Height; y++)
{
Color pixelColor = image1.GetPixel(x, y);
int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));
//create the color object
Color newColor = Color.FromArgb(grayScale, grayScale, grayScale);
//now apply a sepia filter
pixelColor.R = newColor.R*1;
pixelColor.G = newColor.G*0.95;
pixelColor.B = newColor.B*0.82;
image1.SetPixel(x, y, pixelColor);
}
}
private Bitmap grayscale(Image image)
{
Bitmap btm = new Bitmap(image);
for (int i = 0; i < btm.Width; i++)
{
for (int j = 0; j < btm.Height; j++)
{
int ser = (btm.GetPixel(i, j).R + btm.GetPixel(i, j).G + btm.GetPixel(i, j).B) / 3;
btm.SetPixel(i, j, Color.FromArgb(ser, ser, ser));
}
}
return btm;
}
GetPixel
/SetPixel
非常慢),而且简单,但有两个主要问题。黑白(1像素)转换的结果非常糟糕,当源图像具有透明背景时,它会变成黑色。第二个问题是,即使在˙color˙图像上调用了Dispose
方法,文件(在本例中为file.jpg
)仍将被锁定。最好使用图形中的DrawImage
方法。(这条评论不是给Serov Danil,而是给其他程序员的) - Julo