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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2017, 17:41   #1
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию Ошибка с формированием пикселей изображения

Здравствуйте!
Пишу одну программу для некой обработки изображений. После обработки, применяя обратное масштабирование и формируя пиксели, вылетает ошибка:
"Необработанное исключение типа "System.ArgumentException" в System.Drawing.dll. Дополнительные сведения: Значение '-2147483648' недопустимо для 'red'. 'red' должно быть больше или равно 0 и меньше или равно 255."

Не знаю, откуда может появляться такое значение, если в методе Scale расписано условие для того, чтобы значения были строго от 0 до 255.
Раньше с изображениями никогда не работала - это первый опыт. Может я до конца не понимаю, как работают методы SetPixel и Color.FromArbg. Помогите, пожалуйста, разобраться.

Цикл, в котором вылетает ошибка:
Код:
for (int j = 0; j < bmp.Height; j++)
            {
                for (int i = 0; i < bmp.Width; i++)
                {
                    bmp.SetPixel(i, j, Color.FromArgb((int)Scale(-1, 1, 0, 255, Red[i, j]), (int)Scale(-1, 1, 0, 255, Green[i, j]), (int)Scale(-1, 1, 0, 255, Blue[i, j])));
                }
            }
Метод Scale:
Код:
public double Scale(int fromMin, int fromMax, int toMin, int toMax, double x)
        {
            if (fromMax - fromMin == 0)
                return 0;
            double value = (toMax - toMin) * (x - fromMin) / (fromMax - fromMin) + toMin;
            if (value > toMax)
            {
                value = toMax;
            }
            if (value < toMin)
            {
                value = toMin;
            }
            return value;
        }
Аруми вне форума Ответить с цитированием
Старый 01.04.2017, 01:34   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Так ничего не понятно.
Попробуй в методе "Scale", перед "return" сделать вывод сообщения на экран; сообщение по условию ( 0>value или value>255). В сообщении вывести все параметры, которые использовались при расчёте:
Код:
toMax - toMin) * (x - fromMin) / (fromMax - fromMin) + toMin;
ura_111 вне форума Ответить с цитированием
Старый 02.04.2017, 16:09   #3
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Попробуй в методе "Scale", перед "return" сделать вывод сообщения на экран; сообщение по условию ( 0>value или value>255). В сообщении вывести все параметры, которые использовались при расчёте
Вывела, проверила... точно ошибка не в Scale. Условия работают нормально и значения все в итоге от 0 до 255.
Аруми вне форума Ответить с цитированием
Старый 02.04.2017, 17:21   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Какие у тебя еще предположения?
___________________________________ ___________________________

Для надёжности в методе Scale напиши не:
Код:
return value;
а
Код:
return 150;
___________________________________ __________________________

Если это действительно не Scale, тогда что?
Еще предположения: возьми все три цвета замени на "Blue", т.е. проверить ошибка выскакивает только при "Red" или это только первая ошибка, а потом программа стопориться.
___________________________________ __________________________

Ещё предположение: чему равно "bmp.Height" ("bmp.Width")?
(временно закомментируй циклы и просто выведи на экран)
Оно больше 255?
___________________________________ ___________________________

что такое "Red[i, j]"?
Какае-то функция?
___________________________________ ___________________________

Проверяй как можно больше... Чем больше предположений проверишь, тем более правдивая картина будет...
___________________________________ _______

Показывай скриншоты на фоне кода.
Ты умеешь делать скриншоты?
ura_111 вне форума Ответить с цитированием
Старый 02.04.2017, 22:22   #5
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Код:

return 150;
работает - на выходе выдает серое изображение


Цитата:
Сообщение от ura_111 Посмотреть сообщение
Еще предположения: возьми все три цвета замени на "Blue", т.е. проверить ошибка выскакивает только при "Red" или это только первая ошибка, а потом программа стопориться.
выдает ту же ошибку, причем с тем же 'red'.



Цитата:
Сообщение от ura_111 Посмотреть сообщение
Ещё предположение: чему равно "bmp.Height" ("bmp.Width")?
высота и ширина изображения - в моем случае используются изображения только размера 512 на 512.


Цитата:
Сообщение от ura_111 Посмотреть сообщение
что такое "Red[i, j]"?
Red, Blue и Green являются матрицами коэффициентов для соответствующих цветовых каналов.


Цитата:
Сообщение от ura_111 Посмотреть сообщение
Какие у тебя еще предположения?
после проверки с заменой на Blue, я вообще перестала понимать, какое 'red' не может иметь такое значение) явно не про матрицу Red... остаюсь при мнении, что всё же не понимаю как работают методы SetPixel и Color.FromArbg...
Аруми вне форума Ответить с цитированием
Старый 03.04.2017, 04:47   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я экспериментировал:

3.jpg

подставлял также разные значения (вплоть до "ошибочных"):


3_1.jpg


В тоже время, это число представляет собой
предельное число для int:


4.jpg


p.s.: сейчас у меня три предположения (но сначала, приведи свой код к первоначальному состоянию).

а) В описании написано, что нужно подставить "byte", а у тебя приведение к "int" (это когда "...(int)...(int)...(int)....(int). ..."). Замени приведение на "(byte)"
Вот этот момент:

5.jpg


т.е. что-то вроде такого
(у меня работало и так и так):



6.jpg


б) Или индексы "i,j" выходят за пределы матрицы RED[], т.е. RED[512, 512] просто не существует.

в) Или в массиве RED[i,j] есть все элементы, но какой-то просто не рассчитан (не присвоено числовое значение).

По последним двум пунктам, нужно знать как формируется матрицы RED,BLUE GREA.
Их можно (временно) вывести куда-нибудь (в листбокс, например) чтобы посмотреть на значения?
Есть ли какае-то первоначальное обнуление этих матриц?

p.s.: дело в том, что слова "матрицами коэффициентов для соответствующих цветовых каналов" мне ничего не говорят.

Последний раз редактировалось ura_111; 03.04.2017 в 04:52.
ura_111 вне форума Ответить с цитированием
Старый 03.04.2017, 07:38   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

смотрите отладчиком на каких индексах что не так.
а потом проверяете результаты через вычисленное значение.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.04.2017, 01:48   #8
Аруми
Пользователь
 
Аватар для Аруми
 
Регистрация: 08.11.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
В описании написано, что нужно подставить "byte", а у тебя приведение к "int" (это когда "...(int)...(int)...(int)....(i nt). ..."). Замени приведение на "(byte)"
да! заменила) всё заработало) спасибо
Аруми вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# RGB поиск схожих по цвету пикселей. Упрощение изображения. zink Помощь студентам 1 08.11.2014 22:09
Проблема с формированием массива Drac0Sha Помощь студентам 4 24.12.2012 22:10
Вопрос по координатам пикселей изображения. Vova777 Общие вопросы Delphi 0 06.07.2011 17:09
Проблема с формированием отчета Swatch Microsoft Office Access 1 25.02.2010 00:32
Как избежать сужения (уменьшение размера) пикселей изображения, при включенном свойстве Stretch? Лукманов Александр Мультимедиа в Delphi 8 26.10.2009 09:52