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

Вниз

Про пиксели - 2   Найти похожие ветки 

 
Серж Долгов   (2002-03-29 22:17) [0]

Благодарю за ответ, чтобы не было впечатления, что я от любопытства у народа время отнимаю - поясню ситуацию. Задача у проги такая. Ей передается сканированное изображение (*.BMP), затем необходимо вытянуть из этого файла кол-во пикселей такого -то цвета. Либо посчитать сумму всех не белых пикселей. Скорость работы прерогативой не является, каким из 3 методов проще все это дело крутануть?. Заранее извинюсь, но в ентом деле я пока чайник, разве что не закипаю пока от своих ошибок, если есть возможность поподробнее - очень прошу. Еще раз Вашему сайту и людям человеческое спасибо.


 
SDS ©   (2002-03-29 23:35) [1]

Самый простой (хотя это для кого как)
В цикле по Width и Height твоего BMP прогнать все пиксели с помощью Pixels[i,j] и посмотреть сколько появиться белый цвет, но скорость будет аховая (в смысле очень медленно, особенно если BMP большой)


 
MBo ©   (2002-03-30 11:39) [2]

с Bitmap.Canvas.Pixels обращаться очень просто.
у меня на P600 1280*960 пробегает за ~8-10 сек.

вот пример для Scanline (менее 1 сек.)

procedure TForm1.Button1Click(Sender: TObject);
type
TRGBTArray = array [word] of TRGBTriple;
PRGBTArray=^TRGBTArray;
var b:tbitmap;
i,j,n:integer;
p:PRGBTArray;
begin
b:=tbitmap.create;
b.LoadFromFile("e:\dsc00001.bmp");
n:=0;
for i:=0 to b.height-1 do begin
p:=b.ScanLine[i];
for j:=0 to b.width-1 do
if (p[j].rgbtBlue and p[j].rgbtRed and p[j].rgbtGreen)=$FF then
inc(n);
end;
label1.caption:=inttostr(n);// число белых пикселов
b.free;
end;


 
Серж Долгов   (2002-03-30 14:00) [3]

To MBo:

К сожалению, не мойгу в версии 3й дельфи scanline, а если так? (ниже привожу свою кривульку) Правда здесь ищется сумма всех небелых, но это не суть важно.
Чуть не забыл. О-Г-Р-О-М-Н-О-Е Вам спасибо

procedure TForm1.Button1Click(Sender: TObject);
type
var b:tbitmap;
i,j,n:integer;
begin
b:=tbitmap.create;
b.LoadFromFile("e:\dsc00001.bmp"); //есть ли возможность
//загрузки любого файла
//с винта?
n:=0;
For i:= 0 to b.height do // поясните смысл b.height-1
//пож-та
for j:= 0 to b. width do // -//- b.Width -1
if b.Canvas.Pixels [i,j]<>clWhite then
inc (n);
end;
edit1.caption:=inttostr(n);
b.free;
end;


 
MBo ©   (2002-03-30 14:21) [4]

любой bmp можно загрузить - а можно из другого источника, например, нарисовать или со сканера напрямую, если есть возможность.
b.height-1
потому что нумерация с нуля, если высота 10, то последняя строка с индексом 9

программа правильная.(кроме -1 пропущенных) и end перед Edit1. убери

Посмотри, как кодируется цвет - это Integer, 3 байта- RGB
если понадобится более сложное сравнение.


 
Серж Долгов   (2002-03-30 23:54) [5]

Всем уважаемым Мастерам вечер добрый.
Снова прошу у Вас помощи по предыдущему вопросу.
Добавил процедуру для загрузки изображения. Как теперь указать Дельфе, что считать колво пикселей нужно именно этого изображ-я. Пожайлуста помогите.

procedure TForm1.Button4Click(Sender: TObject);
Var
begin
With OpenPictureDialog1 Do
IF Execute then
Begin
Image1.Picture.LoadFromFile(FileName);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Image1:TBitMap;
i,j,Sum:integer;
begin
Image1:=TBitmap.create;
//b.LoadFromFile("e:\dsc00001.bmp");
Sum:=0;
For i:= 0 to Image1.Height-1 do
for j:= 0 to Image1.Width-1 do
if Image1.Canvas.Pixels [i,j]<>clWhite then
inc(Sum);
label9.caption:=inttostr(Sum);
Image1.free;
end;


 
Sergey_n ©   (2002-03-31 03:04) [6]

procedure TForm1.Button1Click(Sender: TObject);
var
pBits: array of Byte;
i: Integer;
j: Integer;
Sum: Integer;
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile("C:\My Documents\PERSONAL\History\VisitCard.bmp");

//Для Картинки типа BMP имеющей 4*8=32bit цветов
SetLength(pBits, Bitmap.Height * Bitmap.Width*4);
GetBitmapBits(Bitmap.Handle,640*480*4,pBits);
Sum :=0;
for i:=0 to Bitmap.Width-1 do begin
for j:=0 to Bitmap.Height-1 do begin
//pBits[i*480+j*4] Red
//pBits[i*480+j*4+1] Green
//pBits[i*480+j*4+2] Blue
//pBits[i*480+j*4+3] Не знаю
if pBits[i*Bitmap.Width+j*4]+pBits[i*Bitmap.Width+j*4+1]+pBits[i*Bitmap.Width+j*4+2]=765 then inc(Sum);
end;
end;
label9.caption:=inttostr(Sum);
//Если нужно отобразить, то раскоментарь строчки ниже
//Image1.Width := Bitmap.Width;
//Image1.Height := Bitmap.Height;
//Image1.Canvas.Draw(0,0,Bitmap);
Bitmap.Free;
end;


 
Sergey_n ©   (2002-03-31 03:06) [7]

Блин очепятка
GetBitmapBits(Bitmap.Handle,640*480*4,pBits);
заменить на
GetBitmapBits(Bitmap.Handle,Bitmap.Height * Bitmap.Width*4,pBits);
есессено


 
Sergey_n ©   (2002-03-31 03:06) [8]

Блин очепятка
GetBitmapBits(Bitmap.Handle,640*480*4,pBits);
заменить на
GetBitmapBits(Bitmap.Handle,Bitmap.Height * Bitmap.Width*4,pBits);
есессено


 
Серж Долгов   (2002-03-31 04:05) [9]

Спасибо. Интересует насколько плох предыдущий код?Мне просто его понять легче - просто копировать не хочу, мне в ентом разобраться нужно. И еще. Необходимо повесить открытие файла (любого из любой директории через Image1.Picture.LoadFromFile(FileName) и процедуру расчета на разные кнопари. Будет много рисунков, возможно большого размера - не хотелось бы что б после открытия имелась возможность просмотра чего там загрузилось, а затем уж процедурка рассчета. У меня не получилось корректно указать в procedure TForm1.Button1Click(Sender: TObject) на загруженный файл. Как это попрямее сделать. Ну и возвращусь - чем лучше предложенный алгоритм с практической точки зрения?
Заранее благодарен всем Вам.


 
Sergey_n ©   (2002-03-31 04:26) [10]

1. GetBitmapBits(Bitmap.Handle,Bitmap.Height * Bitmap.Width*4,pBits); загоняет битмар в массив, ну а с массивом работаь IMXO быстрее.
2. Из любого файла? Замени Bitmap.LoadFromFile("C:\My Documents\PERSONAL\History\VisitCard.bmp"); на Bitmap.LoadFromFile(OpenPictureDialog1.FileName"); но не забывай про битность рисунка, ее в принципе тоже можно выудить, если покопаться в хелпе
3. Воозможность просмотра:
//Если нужно отобразить, то раскоментарь строчки ниже
//Image1.Width := Bitmap.Width;
//Image1.Height := Bitmap.Height;
//Image1.Canvas.Draw(0,0,Bitmap);

вставить после Bitmap.LoadFromFile(OpenPictureDialog1.FileName"); и смотри на здоровье.
4. с прктической точки зрения:
a. имеешь доступ к каждой составляющей цвета (R,G,B) по отдельности
b. скорость (сравни сам)


 
Серж Долгов   (2002-04-01 01:03) [11]

Всем Мастерам своего дела вечер добрый. Грустно, но нужна Ваша помощь. Помогите разобраться. Привожу прежний код, а то Вам смотреть неудобно – скролировать придется, а чужое время уважать нужно. К делу. Помогите повесить процедуру открытия файла (бмп) и расчетноко блока n:=0; For i:= 0 to b.height do …… и.д.. на разные кнопари. Есть необходимость такая. Последнее. Не получается подружить процесс открытия любого файла (спрашивал – без ответа) Image1.Picture.LoadFromFile(FileName) с нижеприведенным кодом. Буду очень признателен, если процесс весь опишете в коде, что б уже не надоедать более по этому вопросу.
Искреннее спасибо Всем помогающим.


procedure TForm1.Button1Click(Sender: TObject);
type
var b:tbitmap;
i,j,n:integer;
begin
b:=tbitmap.create;
b.LoadFromFile("e:\dsc00001.bmp");
n:=0;
For i:= 0 to b.height do
for j:= 0 to b. width do
if b.Canvas.Pixels [i,j]=clWhite then
inc (n);
end;
label3.caption:=inttostr(n);
b.free;
end;



 
Серж Долгов   (2002-04-01 01:06) [12]

Всем Мастерам своего дела вечер добрый. Грустно, но нужна Ваша помощь. Помогите разобраться. Привожу прежний код, а то Вам смотреть неудобно – скролировать придется, а чужое время уважать нужно. К делу. Помогите повесить процедуру открытия файла (бмп) и расчетноко блока n:=0; For i:= 0 to b.height do …… и.д.. на разные кнопари. Есть необходимость такая. Последнее. Не получается подружить процесс открытия любого файла (спрашивал – без ответа) Image1.Picture.LoadFromFile(FileName) с нижеприведенным кодом. Буду очень признателен, если процесс весь опишете в коде, что б уже не надоедать более по этому вопросу.
Искреннее спасибо Всем помогающим.


procedure TForm1.Button1Click(Sender: TObject);
type
var b:tbitmap;
i,j,n:integer;
begin
b:=tbitmap.create;
b.LoadFromFile("e:\dsc00001.bmp");
n:=0;
For i:= 0 to b.height do
for j:= 0 to b. width do
if b.Canvas.Pixels [i,j]=clWhite then
inc (n);
end;
label3.caption:=inttostr(n);
b.free;
end;



 
Sergey_n ©   (2002-04-01 02:03) [13]

Я так и не понял... Чё те надо, вроде все написано, и даже скорость увеличили..... Разъясняй конкрктнее... и вообще причем тут Image1.Picture.LoadFromFile(FileName)????????????
Задай вопрос конткретно.


 
Mbo ©   (2002-04-01 06:49) [14]

var
form1:TForm1;
b:TBitmap;//глобальная переменная

procedure TForm1.FormCreate(Sender: TObject);
begin
b:=tbitmap.create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
b.free;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
b.LoadFromFile(OpenDialog1.Filename);
Image1.Picture.Assign(b);//если надо показывать
end;

procedure TForm1.Button2Click(Sender: TObject);
i,j,n:integer;
begin
For i:= 0 to b.height -1 do //еще раз подчеркиваю
for j:= 0 to b. width -1 do
if b.Canvas.Pixels [i,j]=clWhite then
inc (n);
end;
label3.caption:=inttostr(n);
end;


 
Mbo ©   (2002-04-01 06:50) [15]

n:=0 забыл перед циклом


 
Серж Долгов   (2002-04-02 02:52) [16]

TO Mbo, Sergey_n, SDS
Спасибо Вам огромное. За поддержку и терпение. (to Sergey_n - cогласен, чушь понаворотил в последнем вопросе)
Сейчас все компилится.
Ежели снова "попрошусь" - не "выгоняйте".
Имелось бы "виртуальне пиво" - "проставился" бы обизон. Хотя, говорят и безалкогольное-то пиво и то - первый шаг на пути к резиновой женщине 8)
Спасибо



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

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

Наверх




Память: 0.52 MB
Время: 0.014 c
14-24181
AL2002
2002-07-11 20:36
2002.08.08
Искусственный интеллект


6-24157
Sherbacov
2002-05-29 15:39
2002.08.08
NMFTP1.Download (Все файлы)


3-23943
Explorer
2002-07-18 14:29
2002.08.08
КАК РЕЗУЛЬТАТ ЗАПРОСА ЗАПИСАТЬ В ФАЙЛ


3-23902
mazepa
2002-07-17 19:58
2002.08.08
для чайников


1-24111
V.Turecky
2002-07-26 18:17
2002.08.08
Как программно изменить метку тома винчестера?