Главная страница
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.018 c
1-65918
andrei
2003-11-07 14:47
2003.11.20
Упаковка файлов в exe шник


1-65934
BlackKing
2003-11-11 12:39
2003.11.20
Как определить, есть ли у компонента заданная функция?


1-65924
glitch
2003-11-10 20:52
2003.11.20
Вопросы по реестру


1-65900
ak75
2003-11-08 18:00
2003.11.20
TThread. Что не так? И как с этим бороться?


14-66129
MaG
2003-10-28 15:45
2003.11.20
Паскаль