Обработка изображений (LockBits). Проблемы с условием цикла по обработке каждого пикселя - C#
Формулировка задачи:
Здравствуйте. Вопрос обстоит так. Хочу разобраться с обработкой изображений. Как понял, для этого необходимо загрузить изображение в bitmap, и, используя LockBits, можно изменить значение каждого пикселя (источник вдохновения). У меня получился такой код (по сути, тоже самое, с другими названиями, но, мало ли):
Собственно, вопрос состоит в том, почему нельзя в условии цикла указывать последовательный перебор пикселей, начиная от нулевого и с шагом 1? Мысли были разные, сначала подумал, что в этом массиве может в начале храниться информация о формате и т.д., но если вручную написать:
, то всё получится - для изображений любого размера. Потом решил, что дело в размере изображения, и попробовал использовать картинку 10х10. И тогда в теле цикла нужно было прописывать начальное значение не меньше 3.
Понимаю, что вопрос вообще какой-то странный и глупый, что ответ может лежать где-то совсем на поверхности и, возможно, я не понимаю элементарного, но теперь не успокоюсь, пока не разберусь
Так же, возможно, для частотной обработки изображений я выбрал вообще не тот подход для начала (так как смущает то, что нужно будет умножать пиксели на нецелые числа, то есть, уже не byte массив, а double). Но это уже другой вопрос. Буду благодарен за любые ссылки и советы в сторону решения.
private void Form1_Load(object sender, EventArgs e) { label1.Text = ""; Bitmap img = new Bitmap("D:/1.jpg"); Rectangle img_zone = new Rectangle(0, 0, img.Width, img.Height); System.Drawing.Imaging.BitmapData img_data = img.LockBits(img_zone, System.Drawing.Imaging.ImageLockMode.ReadWrite, img.PixelFormat); IntPtr img_first_pixel = img_data.Scan0; int img_bytes = Math.Abs(img_data.Stride * img.Height); byte[] img_rgbValues = new byte[img_bytes]; System.Runtime.InteropServices.Marshal.Copy(img_first_pixel, img_rgbValues, 0, img_bytes); /*ОБРАБОТКА*/ for (int c = 0; c <= img_rgbValues.Length; c++/*Вот здесь появляются проблемы*/) { img_rgbValues[c] = 255; } /*КОНЕЦ ОБРАБОТКИ*/ System.Runtime.InteropServices.Marshal.Copy(img_rgbValues, 0, img_first_pixel, img_bytes); img.UnlockBits(img_data); img.Save("D:/2.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); img.Dispose(); }
img_rgbValues[0]=255; img_rgbValues[1]=255; img_rgbValues[2]=255;
Решение задачи: «Обработка изображений (LockBits). Проблемы с условием цикла по обработке каждого пикселя»
textual
Листинг программы
for (int c = 0; c <= img_rgbValues.Length; c++/*Вот здесь появляются проблемы*/) { img_rgbValues[c] = 255; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д