![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Палитра [D7, WinXP]
Radgar © (2005-07-01 14:02:00)Подскажите, пожалуйста, как узнать палитру у определенного пикселя TImage, в таком формате Red - xxx, Blue - xxx, Green -xxx.
Virgo_Style (2005-07-06 08:57:00) [1]Магнитон Борыч (05.07.05 20:35) [13]
На мой взгляд, если важнее простота и удобство, то Pixels и Get..Value, если скорость - то ScanLine и математика, а смешивать их...
В общем, дело вкуса %-)
Магнитон Борыч (2005-07-05 20:35:00) [2]> Virgo_Style © (05.07.05 16:10) [12]
> Но тогда Pixels[] тем более нельзя использовать.
В циклах..
Virgo_Style (2005-07-05 16:10:00) [3]Магнитон Борыч (04.07.05 17:59) [8]
но дольше.
В принципе, я об этом подозревал... Но тогда Pixels[] тем более нельзя использовать.
uny (2005-07-05 12:32:00) [4]Магнитон Борыч (04.07.05 21:58) [10]
я для этой функции выяснил что значит байт 0. если tcolor
1,2,3 - b,g,r
может моя быстрее ;)
function divdw(dwme:longword; he:byte):byte;
asm //0 1 2 3
mov ecx,eax
cmp dl,0
je @@1
shl ecx,8
cmp dl,1
je @@1
shl ecx,8
cmp dl,2
je @@1
shl ecx,8
@@1: shld eax,ecx,8
end;
Магнитон Борыч (2005-07-04 21:58:00) [5]uny © (04.07.05 18:31) [9]
Всё ясно :))
uny (2005-07-04 18:31:00) [6][6] Магнитон Борыч (03.07.05 17:32)
там же если системная палитра, то одна цифра, если другая палитра - и цифра тоже другая. в справке написано. чем не номера?)
Магнитон Борыч (2005-07-04 17:59:00) [7]> Virgo_Style © (03.07.05 21:36) [7]
Мне кажется, лучше использовать GetRValue, GetGValue, GetBValue - так красивше =)
но дольше.
Virgo_Style (2005-07-03 21:36:00) [8]Магнитон Борыч (03.07.05 17:32) [6]
R := Lo(C);
G := Lo(C shr 8);
B := Lo((C shr 8) shr 8);
Мне кажется, лучше использовать GetRValue, GetGValue, GetBValue - так красивше =)
Магнитон Борыч (2005-07-03 17:32:00) [9]> uny © (01.07.05 19:20) [5]
> tcolor это 32 бита, а не 24, старший байт это номер палитры.
Ты не выспался что ли? Какой номер палитры? :))
> Radgar © (01.07.05 14:56) [3]
> Посоветуй что лучше сделать, если мне надо считать R G B при OnMouseDown.
var C: TColor;
R, G, B: Byte;
begin
C := TImage.Canvas.Pixels[X, Y];
R := Lo(C);
G := Lo(C shr 8);
B := Lo((C shr 8) shr 8);
end;
uny (2005-07-01 19:20:00) [10]tcolor это 32 бита, а не 24, старший байт это номер палитры.
Digitman (2005-07-01 16:05:00) [11]
> при OnMouseDown
при OnMouseDown тебе известны X и Y
дальше - см. [2]
Radgar (2005-07-01 14:56:00) [12]Анонимщики ©
> гораздо лучше использовать ScanLine битмэпа
Посоветуй что лучше сделать, если мне надо считать R G B при OnMouseDown.
Анонимщики (2005-07-01 14:46:00) [13]Зря я тебе порекомендовал к поисковым серверам обратиться.
Читай хелп по графике, пока что-нибудь не поймешь.
А палитру имеет (может иметь) не отдельный пиксел, а все изображение в целом.
Смотри. Есть, предположим, графический файл, скажем, для простоты, bmp. У него в заголовке записано, какой формат имеют пикселы (отдельные точки) этой картинки. Картинку может иметь палитру - это индексированная, точнее, нумерованная, таблица элементов, каждый элемент которой имеет номер и соответствующие ему значения - R (red), G (green) и B (blue), все - от 0 до 255; сколько таких элементов - вопрос третий. В той области файла, где хранятся данные, хранятся вместо троек (R, G, B) индексы палитры - так компактнее.
Но картинка может палитры и не иметь, тогда указывается не индекс элемента палитры, а сама тройка.
При отображении в TImage ты можешь получить каждый цвет каждой точки через TImage.Picture.Bitmap.Canvas.Pixels[X, Y] - результат будет типа TColor; при этом тип витмэпа (HandleType) должен быть DIB. Доступаться таким образом по очереди к каждой точке неэффективно, гораздо лучше использовать ScanLine битмэпа (тебе это будет делать проще всего при 24 битах на пиксел). Чтобы, затем, получить значения R, G и B, нужно будет вызвать функции GetRValue, GetGValue и GetBValue.
Читай хелп по:
TImage, TPicture, TBitmap, TCanvas, TColor.
Alexander Panov (2005-07-01 14:39:00) [14]А что такое палитра у пикселя?