Обработка изображений (LockBits). Проблемы с условием цикла по обработке каждого пикселя - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Вопрос обстоит так. Хочу разобраться с обработкой изображений. Как понял, для этого необходимо загрузить изображение в bitmap, и, используя LockBits, можно изменить значение каждого пикселя (источник вдохновения). У меня получился такой код (по сути, тоже самое, с другими названиями, но, мало ли):
       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();
               
        }
Собственно, вопрос состоит в том, почему нельзя в условии цикла указывать последовательный перебор пикселей, начиная от нулевого и с шагом 1? Мысли были разные, сначала подумал, что в этом массиве может в начале храниться информация о формате и т.д., но если вручную написать:
img_rgbValues[0]=255;
img_rgbValues[1]=255;
img_rgbValues[2]=255;
, то всё получится - для изображений любого размера. Потом решил, что дело в размере изображения, и попробовал использовать картинку 10х10. И тогда в теле цикла нужно было прописывать начальное значение не меньше 3. Понимаю, что вопрос вообще какой-то странный и глупый, что ответ может лежать где-то совсем на поверхности и, возможно, я не понимаю элементарного, но теперь не успокоюсь, пока не разберусь Так же, возможно, для частотной обработки изображений я выбрал вообще не тот подход для начала (так как смущает то, что нужно будет умножать пиксели на нецелые числа, то есть, уже не byte массив, а double). Но это уже другой вопрос. Буду благодарен за любые ссылки и советы в сторону решения.

Решение задачи: «Обработка изображений (LockBits). Проблемы с условием цикла по обработке каждого пикселя»

textual
Листинг программы
            for (int c = 0; c <= img_rgbValues.Length; c++/*Вот здесь появляются проблемы*/) 
            {
                img_rgbValues[c] = 255;
                
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы