Ваш вопрос показывает вы довольно запутались в образах и .NET Framework.
С моим ответом я не буду предоставлять вам код, так как требуется немного дополнительного времени, но я хочу помочь вам с советами. Вот алгоритм, кодирование будет за вами.
Прежде всего, получите изображение как RGB, используя класс Image
. После загрузки изображения у вас есть структура из пикселей, каждая из которых имеет три компонента R
, G
и B
. Пожалуйста, не обижайтесь, если я начну с самых оснований, но я понятия не имею о вашем фактическом уровне опыта.
Теперь вам нужно сгенерировать новое изображение с таким же расширением и высотой исходного изображения. Изображение в оттенках серого характеризуется наличием R==G==B
, что означает, что новое изображение должно иметь все 3 значения одинаковые для каждого пикселя.
Чтобы получить значение, у вас есть несколько вариантов: общий вариант (в основном неправильный) заключается в выполнении среднего арифметического, т.е. C = (R+G+B)/3
(вам нужно усвоить его трижды, один раз для каждого компонента). Я расскажу вам позже, почему этот выбор неправильный, но общепринятый.
Вот псевдокод, который работает для вас
Image old;
old = Image.Load("file.bmp"); //I don't currently have MSDN at hand, nor I remember how to load the bitmap
Image new = new Image{ Width = old.Width; Height = old.Height };
for (i=0; i<old.Width-1; i++)
for (j=0; j<old.Height; j++)
{
Color p = old[i,j];
byte gray = (p.R+p.G+p.B)/3;
new[i,j] = new Color(gray,gray,gray);
}
}
pictureBox.Image = new;
Опять уведомления: этот код напоминает псевдо-код, и я на самом деле не проверить.
Почему арифметическое означает неправильно?
(самая интересная часть вопроса, с научной точки)
полутоновых изображений основаны на концепции яркости, что сила света, отраженного от объекта, и впечатление на яркости датчик (т. е. полутоновая камера). Цветной естественный свет состоит из электромагнитных волн с широким спектром, но общие датчики срабатывают только по частотам в . Красный, зеленый и синий Спектры. Человеческий глаз, также, более чувствителен к зеленому цвету, чем другие (у меня была диаграмма, показывающая реакцию человеческого глаза на свет на разных частотах).
Это означает, что принимающие компоненты в трех легких обеспечивают равной способствуют яркости не так, как тогда, когда вы показываете зрителю две лампы той же мощности, один фильтрованной зеленый и один отфильтрованный синий, наблюдатель скажет вам что зеленый свет ярче.
Существует таблица преобразования (я обновляю сообщение позже, если найду его), который показывает, как выполнять взвешенное значение с соответствующими коэффициентами для борьбы с этим явлением.Также было обнаружено, что изображения, преобразованные через эту таблицу, выглядят более реалистичными, чем другие изображения, преобразованные с помощью обычного среднего.
[Последующие меры] Я только что нашел this article с рабочими образцами кода
Редактировать
Теперь, когда вы показали хороший вопрос (и сказали, что у вас есть код преобразования) позвольте мне помочь вам , Если вы разместили код конверсии, это было бы более полезно. Вам необходимо отдельно загрузить ваше изображение с диска, Редактировать it и Свяжите с PictureBox.
Предположив вас есть private Image ConvertToGrayscale(Image source);
, вот код, который работает для вас:
private void btnLoad_Click(object sender, EventArgs e)
{
OpenFileDialog fDialog = new OpenFileDialog();
fDialog.Filter = "Bitmaps |*.bmp| GIFs |*.gif| JPEGs |*.jpg;*.jpeg| TIFs |*.tif";
fDialog.InitialDirectory = @"C:\\";
if (fDialog.ShowDialog() == DialogResult.OK)
{
Image old = Image.FromFile(fDialog.FileName);
pcbImage.Image = ConvertToGrayscale(old);
pcbImage.SizeMode = PictureBoxSizeMode.StretchImage;
}
}
Может быть, вы должны объяснить немного дальше и дать некоторые примеры того, что вы получили и то, что вы хотите. Я три раза читаю ваш вопрос, и я не уверен, что вы хотите сказать ... «вот так». Как что? – Matten
Это приложение WinForms, ASP.NET? MVC или формы? В этом вопросе не хватает информации, чтобы знать, с чего начать. – David
Не уверенный в закрытии ... он, конечно, выглядел немного смущенным (это понятно, поскольку он здесь новый), но, по крайней мере, часть вопроса понятна, хотя где-то может быть дубликат. Просто мое мнение ... Должны ли мы рекомендовать этому парню изменить вопрос и улучшить его? (Может ли он на самом деле редактировать закрытый вопрос?) –