Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2013, 12:33   #1
doodka
 
Регистрация: 26.04.2013
Сообщений: 4
По умолчанию Получение вектора из изображения

Смысл в том, чтобы получать цвет пикселя и если он больше 383 (RGB), то записывать в массив 1; если меньше 383, то записывать -1.
Нашел код который конвертировал изображение в монохромное, но не получается его изменить. Постоянно массивы за пределы выходят...

Код:
        public Form1()
        {
            InitializeComponent();
                
            Bitmap image = new Bitmap(@"C:\2.PNG");
            int[] a = MakeGray(image);
        }
 
        private int[] MakeGray(Bitmap bmp)
        {
            int[] arrayInt;
 
            // Задаём формат Пикселя.
            PixelFormat pxf = PixelFormat.Format24bppRgb;
 
            // Получаем данные картинки.
            Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
            //Блокируем набор данных изображения в памяти
            BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);
 
            // Получаем адрес первой линии.
            IntPtr ptr = bmpData.Scan0;
 
            // Задаём массив из Byte и помещаем в него набор данных.
            // int numBytes = bmp.Width * bmp.Height * 3;
            //На 3 умножаем - поскольку RGB цвет кодируется 3-мя байтами
            //Либо используем вместо Width - Stride
            int numBytes = bmpData.Stride * bmp.Height;
            int widthBytes = bmpData.Stride;
            byte[] rgbValues = new byte[numBytes];
            
            arrayInt = new int[bmp.Width * bmp.Height];
 
            // Копируем значения в массив.
            Marshal.Copy(ptr, rgbValues, 0, numBytes);
            
            for (int counter = 0, i = 0; counter < rgbValues.Length; counter += 3, i++)
            {
                int value = rgbValues[counter] + rgbValues[counter + 1] + rgbValues[counter + 2];
                arrayInt[i] = value > 383 ? 1 : -1;
            }
 
            // Разблокируем набор данных изображения в памяти.
            bmp.UnlockBits(bmpData);
           
            return arrayInt;
        }
doodka вне форума Ответить с цитированием
Старый 10.06.2013, 13:53   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Вы не забывайте что количество байт у вас не равно произведению ширины и высоты.
Код:
arrayInt = new int[bmp.Width * bmp.Height];
к тому же вы вот тут
Код:
int numBytes = bmpData.Stride * bmp.Height;
расчитали значение байт в массиве.
И используйте его на здоровье.

Код:
 arrayInt = new int[numBytes];
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WPF Получение 2D координат 3D вектора Eugene123 WPF, UWP, WinRT, XAML 0 09.10.2010 20:15
получение серого изображения из исходного DeDoK Общие вопросы Delphi 15 10.09.2010 11:45
Получение вектора PastoriXx Общие вопросы .NET 0 14.05.2010 19:52
Процедура.получение вектора единичной дины NeaD Помощь студентам 2 29.12.2009 18:10
Получение свойств изображения Бутаков_Сергей Мультимедиа в Delphi 2 10.06.2009 18:38