Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Пиксель   Найти похожие ветки 

 
Юля   (2003-07-24 14:17) [0]

Уважаемые мастера!!! Подскажите каким образом можно узнать на фотке число пикселей, например желтого цвета. Если можно, то с примерчиком, буду очень благодарна.


 
MBo ©   (2003-07-24 14:28) [1]

Нужно их сосчитать.
медленно - canvas.pixels
быстрее - scanline
махом - http://www.delphimaster.ru/articles/pixels/index.html


 
iXuSs   (2003-07-24 22:23) [2]

Сайт:
http://www.efg2.com

И это:
http://www.efg2.com/Lab/Graphics/Colors/ShowImage.htm


 
Fenik ©   (2003-07-24 22:43) [3]

Очень просто:

function HowManyColours(Bitmap: TBitmap; Color: TColor): Integer;
var R, G, B: Byte;
p: pByteArray;
x, y: Integer;
begin
Result := 0;
R := Lo(Color);
G := Lo(Color shr 8);
B := Lo((Color shr 8) shr 8);
Bitmap.PixelFormat := pf24Bit;
for y := 0 to Bitmap.Height - 1 do begin
p := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do
if (B = p[x*3]) and
(G = p[x*3+1]) and
( R = p[x*3+2]) Очень просто:

function HowManyColours(Bitmap: TBitmap; Color: TColor): Integer;
var R, G, B: Byte;
p: pByteArray;
x, y: Integer;
begin
Result := 0;
R := Lo(Color);
G := Lo(Color shr 8);
B := Lo((Color shr 8) shr 8);
Bitmap.PixelFormat := pf24Bit;
for y := 0 to Bitmap.Height - 1 do begin
p := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do
if (B = p[x*3]) and
(G = p[x*3+1]) and
(R = p[x*3+2]) then Inc(Result);
end;
end;

...

x := HowManyColours(Bmp, clYellow);


 
iXuSs   (2003-07-24 23:34) [4]

> Colours

Гм... англичанин?


 
Fenik ©   (2003-07-25 00:32) [5]

А ты переведи..


 
Юля   (2003-07-25 06:48) [6]

>Fenik Все здорово, только x постоянно равен 0 :((


 
wiz ©   (2003-07-25 13:46) [7]

> Юля Процедура работает (сам проверял ;). Может быть все дело в том, что в фотке нет чистого желтого цвета?

Тогда нужно брать не только сам желтый, но и лежащие рядом цвета.

Например так:


function HowManyColoursSmooth(Bitmap: TBitmap; Color: TColor; smoothing:double): Integer;
var R, G, B: Byte;
p: pByteArray;
x, y: Integer;
delta:double;
begin
Result := 0;
R := Lo(Color);
G := Lo(Color shr 8);
B := Lo((Color shr 8) shr 8);
Bitmap.PixelFormat := pf24Bit;
for y := 0 to Bitmap.Height - 1 do begin
p := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do
begin
delta:=sqrt(sqr(B - p[x*3])+sqr(G - p[x*3+1])+sqr(R - p[x*3+2]));
if delta<smoothing then Inc(Result);
( Bmp, clYellow, smooth)
> Юля Процедура работает (сам проверял ;). Может быть все дело в том, что в фотке нет чистого желтого цвета?

Тогда нужно брать не только сам желтый, но и лежащие рядом цвета.

Например так:


function HowManyColoursSmooth(Bitmap: TBitmap; Color: TColor; smoothing:double): Integer;
var R, G, B: Byte;
p: pByteArray;
x, y: Integer;
delta:double;
begin
Result := 0;
R := Lo(Color);
G := Lo(Color shr 8);
B := Lo((Color shr 8) shr 8);
Bitmap.PixelFormat := pf24Bit;
for y := 0 to Bitmap.Height - 1 do begin
p := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do
begin
delta:=sqrt(sqr(B - p[x*3])+sqr(G - p[x*3+1])+sqr(R - p[x*3+2]));
if delta<smoothing then Inc(Result);
end;
end;
end;

...

smooth:=30;
x := HowManyColoursSmooth(Bmp, clYellow, smooth);


параметр smooth задает максимальную разницу между цветом pixel"а и целевым цветом

2 Fenik: Приношу искренние извинения, за использование (и модификацию) вашего кода


 
Fenik ©   (2003-07-25 18:08) [8]

> Юля (25.07.03 06:48)

>Fenik Все здорово, только x постоянно равен 0 :((


Или на изображении нет того цвета который подсчитывается, или битмэп изначально не полноцветный (не 24 бит на пиксель), что при переводе его в полноцветный (Bitmap.PixelFormat := 24Bit) искомый цвет искажается.

У меня функция работает безупречно.


> wiz © (25.07.03 13:46)

> 2 Fenik: Приношу искренние извинения, за использование (и модификацию) вашего кода


Я просто улыбаюсь :)))


 
Fenik ©   (2003-07-25 21:45) [9]

> Я просто улыбаюсь :)))

В смысле, непонятно за что вы извиняетесь :))
Это же замечательно!


 
wiz ©   (2003-07-26 02:39) [10]

2 Fenik: Просто разные люди реагируют по-разному на использование их кода. Тут, как говорится, лучше перебдеть, чем недопить...
;)))



Страницы: 1 вся ветка

Текущий архив: 2003.11.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
1-65814
Uber ASSA
2003-11-11 20:40
2003.11.20
Таблица со специальными символами


3-65780
Nikolai_S
2003-11-03 10:14
2003.11.20
Сжатие запароленной базы данных MS Access


4-66154
LOX
2003-09-11 15:04
2003.11.20
Как отловить нажатие клавиш


1-65973
yuriy
2003-11-10 23:13
2003.11.20
поиск в memo


6-66049
silver
2003-09-25 18:00
2003.11.20
Как сделать подмену своего IP