2016-01-07 9 views
0

Я пытаюсь создать белое изображение (формат оттенков серого).«System.ArgumentException» при попытке использовать SetPixel (x, y, Color)

Так вот код я использую:

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); 

"Я" существующий Bitmap изображение. Я играю со своими каналами. Принцип состоит в том, чтобы создать 1 пиксельное изображение в оттенках серого, придайте этому пикселю белый цвет, а затем увеличьте его до хорошего размера.

Но у меня есть это в результате:

"Необработанное исключение типа 'System.ArgumentException' произошло в System.Drawing.dll"

Я попытался Color.White но ISN 't разрешено для оттенков серого или индексированных форматов.

Каковы мои другие варианты исправить это?

+0

Не все перечисленные форматы пикселей на самом деле поддерживаются. Остальная часть кода просто странная - почему бы не очистить цвет, который вы хотите, чтобы иметь ??? – TaW

+1

Перечисление PixelFormat имеет пиксельные форматы, которые на самом деле не реализованы полностью. Как 16bppGrayScale. Еще раз, когда GDI + был разработан с предположением, что некоторые пиксельные форматы станут доступными по мере улучшения технологии отображения. Этого не произошло, ЖК-мониторы были на самом деле совсем на шаг назад от ЭЛТ и еще не догнали. Мониторы, поддерживающие градацию серого 16bpp, существуют, вы найдете их в радиологическом отделении вашей местной больницы. Вы знаете, что они стоят, когда вы получаете счет. –

ответ

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); 
    } 

Просто сделано путем размещения цветовых каналов в нужном порядке

+0

Я лично отлаживаю ваш код, кажется, что чего-то не хватает. –

+0

Вы указали значение переменной i? Это битмап, который я открыл из файла .bmp. В противном случае ваш ответ, я уже просмотрел его. Вот что дало мне идею использовать color.FromArgb. – KuroTenshi

+0

Я загружаю 'i' изображение, да. Кажется, что перечисление с именем PaletteFlag, которое из членов, как представляется, определяет, как используются цвета, во всяком случае я не смог найти свойство в классе растрового изображения для установки этих флагов. –

0

Я выложу весь код. В настоящее время я уродлив, я знаю, но это для быстрой необходимости. Я преобразовываю нормальные карты из обычного фиолетового формата в оранжевый формат. Это просто обмен каналами.

Converting normal map from purple format to orange format

Я использую рамки AForge, чтобы сделать это более легко. Я извлекаю необходимые каналы (только красный для замены) из входных изображений. Я клонирую его, что добавляет альфа-канал тоже к записи RGB. Затем я изменяю каналы копии, чтобы получить новое изображение.

Проблема заключается в красных и синих каналах, которым нужны новые белые тона и черные черные изображения.

Мне нужно создать изображение либо в формате «Format8bppIndexed» (что было бы хорошо), либо в худшем случае в «Format16bppGrayScale». 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"); 

 Смежные вопросы

  • Нет связанных вопросов^_^