Некорректное отображение цветов TColor Канвой
Оказывается TCanvas работает с TColor некорректно. Я передаю например в функцию Ellipse
заранее определенный TColor, а когда с помощью Pixels[X][Y] пытаюсь получиить значение цвета отрисованного пиксела, то оказывается, что как по компонентам RGB, так и по абсолютному значению TColor он отличается от исходного Цвета... Правда всего на несколько едениц, глазу-то и незаметно, но у меня к цвету идет привязка идентификации обьектов, а значит разница в еденицу рубит на корню смысл моего алгоритма...
Думаю, может там какая-то палитра встроенная, что Канва в целях ресурсоэкономии цвета округляет, если так, то как ее отменить, чтоб нормально Цвет хранила и возвращала...
Если кто знает в чем дело, Очень прошу ответить... Заранее спасибо.
Оказывается TCanvas работает с TColor некорректно. Я передаю например в функцию Ellipse
заранее определенный TColor, а когда с помощью Pixels[X][Y] пытаюсь получиить значение цвета отрисованного пиксела, то оказывается, что как по компонентам RGB, так и по абсолютному значению TColor он отличается от исходного Цвета...
TCanvas с цветами нормально работает, я проверял в похожем на твой проекте. Пикселем считывал цвет с канвы, все точно передает(проверял во время отладки). Так что см свой алгоритм.
А теперь подробнее о ситуации с 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]... Или еще чего... */
А есть уверенность в том, что Х,Y принадлежат эллипсу ? Ты бы лучше поставил точку, а потом считал её цвет. Так уж точно с координатами никаких ошибок бы не было.
Уверенность есть, поскольку цвет риксела Х,Y извлекался по клику мышки на канве, соответствено куда я кликну, оттуда и цвет берется, и хоть я и не снайпер, но косоглазием пока тоже вроде не страдаю :D
Думаю, может действительно тут дело не в канве, а в самой системе, тем более, что я где-то читал, что функция Pixels работает не со всеми устройствами, и тогда она может возвращать вместо цвета -1 (что в некоторых случаях она иногда мне и возвращала при отладке программы)
Уверенность есть, поскольку цвет риксела Х,Y извлекался по клику мышки на канве, соответствено куда я кликну, оттуда и цвет берется,
А ты переводишь координаты мышки в координаты формы?
А ты переводишь координаты мышки в координаты формы?
В этом нет необходимости т.к код привязан к событию "по нажатию" конкретного компонента, и корректные координаты однозначны, да и как тут ошибешся, если на канве все белое, только один обьект например цветом B RGB(100,200,50), а возвращается соответственно приблизительно что-то вроде(99,206,48) очевидно, что это почти тот же цвет, глаз разницы не улавливает... но pixels разницу выдает...
если на канве все белое, только один обьект например цветом B RGB(100,200,50), а возвращается соответственно приблизительно что-то вроде(99,206,48) очевидно, что это почти тот же цвет, глаз разницы не улавливает... но pixels разницу выдает...
Давай так. Делаем тупейший тест.
Берешь изменяешь цвет любой точки через Pixels, и сразу же считываешь его. Координаты должны храниться в тех же переменных.
Потом заливаешь все каким-нить одним цветом, и опять пытаешься считать по некоторому абсолютному адресу в пределах заливки.
Только так можно будет рассуждать предметно.
В этом нет необходимости т.к код привязан к событию "по нажатию" конкретного компонента, и корректные координаты однозначны, да и как тут ошибешся, если на канве все белое, только один обьект например цветом 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.
Давай так. Делаем тупейший тест.
Берешь изменяешь цвет любой точки через Pixels, и сразу же считываешь его. Координаты должны храниться в тех же переменных.
Потом заливаешь все каким-нить одним цветом, и опять пытаешься считать по некоторому абсолютному адресу в пределах заливки.
Только так можно будет рассуждать предметно.
Ok.
Сделаем, а результы сравним... Но тут возможно и сама продцедура отрисовки более сложного, чем пиксел примитива, свою лепту вносит(например изменяя яркость пикселов ближе к границам примитива)... так что тест не будет до конца обьективен если этот момент не учесть, я тогда по оконным координатам центра эллипса тоже цвет проверю.
Позволь не согласиться с твоим мнением, касательно координат мыши, я ведь обращаюсь не к окну, а к конкретному компоненту, соответственно и возвращаются не оконные координаты, а координаты, являющиеся абсолютом только в пределах границ данного компонента.
Mоngооsе,
Позволь не согласиться с твоим мнением, касательно координат мыши, я ведь обращаюсь не к окну, а к конкретному компоненту, соответственно и возвращаются не оконные координаты, а координаты, являющиеся абсолютом только в пределах границ данного компонента.
Ради интереса, каким образом получаешь координаты мыши? Не через Mouse->CursorPos?
Ради интереса, каким образом получаешь координаты мыши? Не через Mouse->CursorPos?
Да нет, я ведь по событию компонента пишу, а функция OnMouseDown, автоматически создаваемая средой, принимает от системы в качестве входных параметров координаты X и Y... только взять и подставить их куда надо... Кстати я только что провел часть оговоренного выше эксперимента, пока без эллипса, только с пикселем, сейчас о результатах расскажу...
Да нет, я ведь по событию компонента пишу, а функция OnMouseDown, автоматически создаваемая средой, принимает от системы в качестве входных параметров координаты X и Y... только взять и подставить их куда надо... Кстати я только что провел часть оговоренного выше эксперимента, пока без эллипса, только с пикселем, сейчас о результатах расскажу...
А, OnMouseDown , это другая капуста...:) Я думал обрабатывается событие OnClick
Код следующий:
что имеем при отладке:
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
т.е значение ИЗМЕНИЛОСЬ!!!
т.е значение ИЗМЕНИЛОСЬ!!!
На чем рисуем?
Простейший тест.
Код следующий:
что имеем при отладке:
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
А у Mоngооsе нормально работает, странно... Может это у меня тут среда такая глючная?
Только что рисовал на Сanvas, класса TImage, TPaintBox вроде то же самое выдавал...
А у Mоngооsе нормально работает, странно... Может это у меня тут среда такая глючная?
И на PaintBox 3328100.
И если рисовать на Canvase формы, то же 3328100.
Хотя вместо того, чтоб смотреть значение в отладчике проще написать ShowMessage(IntToStr(col));
Только что рисовал на Сanvas, класса TImage,
А если на банальном Bitmap попробовать? Только режим цветности правильный задай. А то знаешь, еще разговоры начнутся, что встроенные акселераторы Интел глючные :)
Попробовать-то на другом дело нехитрое, но какого оно у меня на этих компонентах ТАК работает, если у других-нормально...
У других могут быть другие условия. А Bitmap все перед системой равны.
Попробую днем еще на других машинах этот же код запустить... посмотрим как отреагирют...
О результатах сообщу.
Все мужики! Ложусь спать! Сегодня подрываться в 5 утра... Надо хоть пару часиков покимарить...
Попробую днем еще на других машинах этот же код запустить... посмотрим как отреагирют...
О результатах сообщу.
Возможно это как-то поможет:
Если для св-ва Style от Pen присвоить значение psInsideFrame, то при Width больше чем 1 допускаются цвета отличные от станадартной палитры.
Можеть извратиться и попробовать через преобразование присвоить это значение Styl'ю от Brush?
Кстати, у меня то же ничего не искажается.