' System.ArgumentException'当试图使用SetPixel(x,y,Color)时

时间:2016-01-07 07:40:45

标签: c# bitmap drawing grayscale argumentexception

我正在尝试创建白色图片(灰度格式)。

所以这是我使用的代码:

Bitmap bmp = new Bitmap(1, 1,        
System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);
bmp.SetPixel(0, 0, Color.FromArgb(255, 255, 255));
bmp = new Bitmap(bmp, i.Width, i.Height);

" I"是现有的位图图像。我在玩它的频道。 原理是以灰度创建1像素图像,为此像素提供白色,然后将其放大到合适的大小。

但结果是这样:

  

"未处理的类型' System.ArgumentException'发生在   System.Drawing.dll程序"

我尝试了Color.White,但不允许使用灰度或索引格式。

我有什么其他方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

为什么不在不转换为灰度的情况下这样做呢?

Bitmap A = new Bitmap(i.Width, i.Height);
for (int x = 0; x < i.Width; x++)
    for (int y = 0; y < i.Height; y++)
    {
        Color C = i.GetPixel(x, y);
        Color WD = Color.FromArgb(C.R, 255, C.G, 0);
        A.SetPixel(x, y, WD);
    }

只需将颜色通道按所需顺序放置

即可

答案 1 :(得分:0)

我会发布所有代码。我知道它目前很难看,但它需要快速。 我正在将普通地图从通常的紫色格式转换为橙色格式。它只是频道交换。

Converting normal map from purple format to orange format

我正在使用AForge框架来更轻松地完成此任务。我从输入图片中提取所需的通道(只有红色交换)。我克隆它,它也为RGB条目添加了一个alpha通道。然后我修改副本的通道以获取新图像。

问题在于红色和蓝色通道需要新的白色和黑色投影图像。

我需要在&#34; Format8bppIndexed&#34;中创建一个图像。 (这将是很好的)或更糟糕的&#34; Format16bppGrayScale&#34;。 SetPixel不接受索引格式。

//Opening the normal map (RGB)

Bitmap i = AForge.Imaging.Image.FromFile("C:/Users/KuroTenshi/WD/normalblue/07_bloom_doublemetaldoor_d_high_n.bmp");

//Extract the red channel, that will be put in an alpha channel

ExtractChannel filterR = new ExtractChannel(RGB.R);
Bitmap r = filterR.Apply(i);

//Clone the input image to have a base for the output (it's converted to ARGB)

Bitmap j = AForge.Imaging.Image.Clone(i);

//Extract channels to modify

ExtractChannel filterR2 = new ExtractChannel(RGB.R);
ExtractChannel filterB2 = new ExtractChannel(RGB.B);
ExtractChannel filterA2 = new ExtractChannel(RGB.A);
Bitmap r2 = filterR2.Apply(j);
Bitmap b2 = filterB2.Apply(j);
Bitmap a2 = filterA2.Apply(j);

//Putting input's red channel into output's alpha channel

a2 = r;

//Creating a white Bitmap for the output's red channel

Bitmap bmp = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);
bmp.SetPixel(0, 0, Color.FromArgb(255, 255, 255));
bmp = new Bitmap(bmp, i.Width, i.Height);

r2 = bmp;

//Creating a black Bitmap for the output's blue channel

Bitmap bmp2 = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format16bppGrayScale);
bmp2.SetPixel(0, 0, Color.FromArgb(0,0,0));
bmp2 = new Bitmap(bmp2, i.Width, i.Height);

b2 = bmp2;

//Replace channels

ReplaceChannel replaceFilter = new ReplaceChannel(RGB.A, a2);
replaceFilter.ApplyInPlace(j);
replaceFilter = new ReplaceChannel(RGB.R, r2);
replaceFilter.ApplyInPlace(j);
replaceFilter = new ReplaceChannel(RGB.B, b2);
replaceFilter.ApplyInPlace(j);

//Save output


j.Save("C:/Users/KuroTenshi/WD/normalblue/07_bloom_doublemetaldoor_d_high_n2.bmp");