Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Некорректное отображение цветов TColor Канвой

9.4K
23 мая 2005 года
Speleo
21 / / 23.05.2005
Столкнулся с проблемой, как всегда, когда завтра все должно быть готово... :(

Оказывается TCanvas работает с TColor некорректно. Я передаю например в функцию Ellipse
заранее определенный TColor, а когда с помощью Pixels[X][Y] пытаюсь получиить значение цвета отрисованного пиксела, то оказывается, что как по компонентам RGB, так и по абсолютному значению TColor он отличается от исходного Цвета... Правда всего на несколько едениц, глазу-то и незаметно, но у меня к цвету идет привязка идентификации обьектов, а значит разница в еденицу рубит на корню смысл моего алгоритма...

Думаю, может там какая-то палитра встроенная, что Канва в целях ресурсоэкономии цвета округляет, если так, то как ее отменить, чтоб нормально Цвет хранила и возвращала...

Если кто знает в чем дело, Очень прошу ответить... Заранее спасибо.
317
23 мая 2005 года
Relax
573 / / 20.09.2000
странно как-то... вроде всегда все ок было... может все-таки в алгоритме проблема?
9.6K
23 мая 2005 года
Tigren0k
11 / / 30.04.2005
Цитата:
Originally posted by Speleo

Оказывается TCanvas работает с TColor некорректно. Я передаю например в функцию Ellipse
заранее определенный TColor, а когда с помощью Pixels[X][Y] пытаюсь получиить значение цвета отрисованного пиксела, то оказывается, что как по компонентам RGB, так и по абсолютному значению TColor он отличается от исходного Цвета...



TCanvas с цветами нормально работает, я проверял в похожем на твой проекте. Пикселем считывал цвет с канвы, все точно передает(проверял во время отладки). Так что см свой алгоритм.

9.4K
24 мая 2005 года
Speleo
21 / / 23.05.2005
Почти 12 часов долбался, так и не понял в чем дело, в конце концов, совсем уж отчаился и решил отказаться от этого алгоритма (хотя дело не в нем, я ниже отпишу ситуацию подробнее)... И правильно сделал!!! Через какое-то время меня посетила муза, и я придумал другой алгоритм, немного корявый, но менее ресурсоемкий и очень простой... Все работает, но при одном из случаев выдает ошибку доступа к памяти... ну да ничего, это мелочи, по невнимательности где-то допустил, сейчас отловлю...

А теперь подробнее о ситуации с TCanvas... Я отбросил алгоритм и решил протестировать компонент на простом приложении.
Код был что-то вроде этого:

TColor Color;
Color=RGB(0,100,0);//необязательно так, можно
//и просто значение присвоить
Canvas->Brush->Color=Color;
Canvas->Ellipse(X1,Y1,X2,Y2);
Color=Canvas->Pixels[X][Y];/* X,Y-принадлежат отрисованной фигуре, так вот в этом месте Цвет и меняется... И значение Color здесь не равноценно(хотя и близко) значению, установленному в начале
функции... Я это и в режиме пошаговой отладки проверил-разница в компонентах RGB мне попадалась от 1 до 6 . В чем причина - ума не приложу... Может действительно там какая-то системная палитра или что-то в этом роде? Или ошибка в коде Pixels[X][Y]... Или еще чего... */
376
24 мая 2005 года
Absolut
220 / / 22.11.2002
А есть уверенность в том, что Х,Y принадлежат эллипсу ? Ты бы лучше поставил точку, а потом считал её цвет. Так уж точно с координатами никаких ошибок бы не было.
9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Цитата:
Originally posted by Absolut
А есть уверенность в том, что Х,Y принадлежат эллипсу ? Ты бы лучше поставил точку, а потом считал её цвет. Так уж точно с координатами никаких ошибок бы не было.


Уверенность есть, поскольку цвет риксела Х,Y извлекался по клику мышки на канве, соответствено куда я кликну, оттуда и цвет берется, и хоть я и не снайпер, но косоглазием пока тоже вроде не страдаю :D
Думаю, может действительно тут дело не в канве, а в самой системе, тем более, что я где-то читал, что функция Pixels работает не со всеми устройствами, и тогда она может возвращать вместо цвета -1 (что в некоторых случаях она иногда мне и возвращала при отладке программы)

488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Speleo
Уверенность есть, поскольку цвет риксела Х,Y извлекался по клику мышки на канве, соответствено куда я кликну, оттуда и цвет берется,


А ты переводишь координаты мышки в координаты формы?

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Цитата:
Originally posted by Mоngооsе
А ты переводишь координаты мышки в координаты формы?



В этом нет необходимости т.к код привязан к событию "по нажатию" конкретного компонента, и корректные координаты однозначны, да и как тут ошибешся, если на канве все белое, только один обьект например цветом B RGB(100,200,50), а возвращается соответственно приблизительно что-то вроде(99,206,48) очевидно, что это почти тот же цвет, глаз разницы не улавливает... но pixels разницу выдает...

10
26 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Speleo
если на канве все белое, только один обьект например цветом B RGB(100,200,50), а возвращается соответственно приблизительно что-то вроде(99,206,48) очевидно, что это почти тот же цвет, глаз разницы не улавливает... но pixels разницу выдает...


Давай так. Делаем тупейший тест.

Берешь изменяешь цвет любой точки через Pixels, и сразу же считываешь его. Координаты должны храниться в тех же переменных.

Потом заливаешь все каким-нить одним цветом, и опять пытаешься считать по некоторому абсолютному адресу в пределах заливки.

Только так можно будет рассуждать предметно.

488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Speleo
В этом нет необходимости т.к код привязан к событию "по нажатию" конкретного компонента, и корректные координаты однозначны, да и как тут ошибешся, если на канве все белое, только один обьект например цветом B RGB(100,200,50), а возвращается соответственно приблизительно что-то вроде(99,206,48) очевидно, что это почти тот же цвет, глаз разницы не улавливает... но pixels разницу выдает...

Кроме считывания значения pixela, напиши еще код
Caption = IntToStr(Mouse->CursorPos.x)+" "+IntToStr(Mouse->CursorPos.y);

и будет видно, что позиция мышки задается в координатах экрана.

Перед считыванием пиксела нужно написать
TPoint pt;
pt = ScreenToClient(Mouse->CursorPos);
pt.x-=Canvas->Left;
pt.y-=Canvas->Top;

и выбирать точки через pt.

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Цитата:
Originally posted by Freeman
Давай так. Делаем тупейший тест.

Берешь изменяешь цвет любой точки через Pixels, и сразу же считываешь его. Координаты должны храниться в тех же переменных.

Потом заливаешь все каким-нить одним цветом, и опять пытаешься считать по некоторому абсолютному адресу в пределах заливки.

Только так можно будет рассуждать предметно.



Ok.
Сделаем, а результы сравним... Но тут возможно и сама продцедура отрисовки более сложного, чем пиксел примитива, свою лепту вносит(например изменяя яркость пикселов ближе к границам примитива)... так что тест не будет до конца обьективен если этот момент не учесть, я тогда по оконным координатам центра эллипса тоже цвет проверю.

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Mоngооsе,
Позволь не согласиться с твоим мнением, касательно координат мыши, я ведь обращаюсь не к окну, а к конкретному компоненту, соответственно и возвращаются не оконные координаты, а координаты, являющиеся абсолютом только в пределах границ данного компонента.
488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Speleo
Mоngооsе,
Позволь не согласиться с твоим мнением, касательно координат мыши, я ведь обращаюсь не к окну, а к конкретному компоненту, соответственно и возвращаются не оконные координаты, а координаты, являющиеся абсолютом только в пределах границ данного компонента.

Ради интереса, каким образом получаешь координаты мыши? Не через Mouse->CursorPos?

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Цитата:
Originally posted by Mоngооsе
Ради интереса, каким образом получаешь координаты мыши? Не через Mouse->CursorPos?


Да нет, я ведь по событию компонента пишу, а функция OnMouseDown, автоматически создаваемая средой, принимает от системы в качестве входных параметров координаты X и Y... только взять и подставить их куда надо... Кстати я только что провел часть оговоренного выше эксперимента, пока без эллипса, только с пикселем, сейчас о результатах расскажу...

488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Speleo
Да нет, я ведь по событию компонента пишу, а функция OnMouseDown, автоматически создаваемая средой, принимает от системы в качестве входных параметров координаты X и Y... только взять и подставить их куда надо... Кстати я только что провел часть оговоренного выше эксперимента, пока без эллипса, только с пикселем, сейчас о результатах расскажу...

А, OnMouseDown , это другая капуста...:) Я думал обрабатывается событие OnClick

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Простейший тест.

Код следующий:

что имеем при отладке:
TColor col;
int X,Y,r,g,b;
X=10;
Y=10;
col=RGB(100,200,50);// здесь отладчик выдает
//подсказкой значение 3328100

img->Canvas->Pixels[X][Y]=col;

col=img->Canvas->Pixels[X][Y];// а здесь уже
//выдает 3263331

т.е значение ИЗМЕНИЛОСЬ!!!
10
26 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Speleo
т.е значение ИЗМЕНИЛОСЬ!!!


На чем рисуем?

488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Speleo
Простейший тест.

Код следующий:

что имеем при отладке:
TColor col;
int X,Y,r,g,b;
X=10;
Y=10;
col=RGB(100,200,50);// здесь отладчик выдает
//подсказкой значение 3328100

img->Canvas->Pixels[X][Y]=col;

col=img->Canvas->Pixels[X][Y];// а здесь уже
//выдает 3263331

т.е значение ИЗМЕНИЛОСЬ!!!

Уменя возвращает 3328100

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Только что рисовал на Сanvas, класса TImage, TPaintBox вроде то же самое выдавал...
А у Mоngооsе нормально работает, странно... Может это у меня тут среда такая глючная?
488
26 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Speleo
Только что рисовал на Сanvas, класса TImage, TPaintBox вроде то же самое выдавал...
А у Mоngооsе нормально работает, странно... Может это у меня тут среда такая глючная?

И на PaintBox 3328100.
И если рисовать на Canvase формы, то же 3328100.

Хотя вместо того, чтоб смотреть значение в отладчике проще написать ShowMessage(IntToStr(col));

10
26 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Speleo
Только что рисовал на Сanvas, класса TImage,


А если на банальном Bitmap попробовать? Только режим цветности правильный задай. А то знаешь, еще разговоры начнутся, что встроенные акселераторы Интел глючные :)

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Попробовать-то на другом дело нехитрое, но какого оно у меня на этих компонентах ТАК работает, если у других-нормально...

10
26 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Speleo
Попробовать-то на другом дело нехитрое, но какого оно у меня на этих компонентах ТАК работает, если у других-нормально...


У других могут быть другие условия. А Bitmap все перед системой равны.

9.4K
26 мая 2005 года
Speleo
21 / / 23.05.2005
Все мужики! Ложусь спать! Сегодня подрываться в 5 утра... Надо хоть пару часиков покимарить...
Попробую днем еще на других машинах этот же код запустить... посмотрим как отреагирют...
О результатах сообщу.
243
26 мая 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Speleo
Все мужики! Ложусь спать! Сегодня подрываться в 5 утра... Надо хоть пару часиков покимарить...
Попробую днем еще на других машинах этот же код запустить... посмотрим как отреагирют...
О результатах сообщу.


Возможно это как-то поможет:
Если для св-ва Style от Pen присвоить значение psInsideFrame, то при Width больше чем 1 допускаются цвета отличные от станадартной палитры.
Можеть извратиться и попробовать через преобразование присвоить это значение Styl'ю от Brush?
Кстати, у меня то же ничего не искажается.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог