Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите подщитать количество пикселей в рисунке [D6, D7, WinXP]


Vova ©   (2004-09-27 11:50:00) 

Уважаемые виртуозы делфи подскажите пожалуйста такую вещь:
Я открываю файл картинки(BMP) и считую его побитово, я нашол структуру БМП файла и узнал что каждому цвету отвечает три бита
синий, зелений, красний я проверяю когда все они = нулю таким образом подщитую количество чорных пикселей!

Вопрос таков это все работает токо когда рисунок маленький, а вот когда он побольше мне пишет при наличии 4 пикселей черного цвета что их там 1. Если еще увеличить картинку то напишет другое число! Подскажите пожалуйста в чем тут дело!!!


Vova   (2004-09-27 12:55:00) [1]

Ок! все я понал! думаю теперь получится!


Vova   (2004-09-27 12:52:00) [2]

PVOzerski ещо раз огромное спасибо! ща попробую кодик!


TUser   (2004-09-27 12:50:00) [3]


> Vova   (27.09.04 12:32) [5]

Не делай так. Лучше TBitMap.LoadFromFile, и не надо думать о том, как устроены внутренности формата.


PVOzerski   (2004-09-27 12:50:00) [4]

Сорри, ошибочка...

> tTriplet=packed record
> G,B,R:byte;
>end;

А надо
tTriplet=packed record
B,G,R:byte;
end;

>       if RGB(G,B,R)=dword(clBlack) then
надо бы
if RGB(R,G,B)=dword(clBlack) then

Хотя именно для черного будет работать и так ;^)


PVOzerski   (2004-09-27 12:47:00) [5]

А наподобие такого не подойдет?
procedure TForm1.BitBtn1Click(Sender: TObject);
type
tTriplet=packed record
 G,B,R:byte;
end;
tTriplets=packed record
 data:array[0..0]of tTriplet;
end;
pTriplets=^tTriplets;
var
i,j,BlackCount:integer;
begin
if OpenDialog1.Execute then
 begin
  Image1.Picture.LoadFromFile(OpenDialog1.FileName);
  Image1.Picture.Bitmap.PixelFormat:=pf24bit;
  BlackCount:=0;
  for i:=0 to pred(Image1.Picture.Bitmap.Height)do
   with Image1.Picture.Bitmap,pTriplets(ScanLine[i])^do
    for j:=0 to pred(width)do
     with data[j]do
      if RGB(G,B,R)=dword(clBlack) then
       inc(BlackCount);
   ShowMessage(IntTostr(BlackCount));
 end;
end;


Vova   (2004-09-27 12:32:00) [6]

код вот какой
type col=record
b,g,r: Byte;
end;
var
FromF, ToF: File;
Buf: Col;
S: String;
NumRead, NumWritten, i, BlackCount: Integer;

тут идет открытие файлов: там
 
 AssignFile(FromF,OpenPictureDialog1.FileName);
 Reset(FromF,1);
 
 AssignFile(ToF,'C:\B.bmp');
 Rewrite(ToF, 1);  
// блок в котором идет подщот
repeat
 inc(i);
 BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
   if (i>54)and(Buf.b=0)and(Buf.b=Buf.g)and(Buf.g=Buf.r)    
   then BlackCount:=BlackCount+1;
 BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);


Cosinus   (2004-09-27 12:19:00) [7]

Значит что то не так делаешь. Конкретный совет только после кода. Насколько я помню структура там простая до опупения : что то типа шапки стандартного размера (48 байт?) а далее действительно по три байта на пиксель (естественно, что все, что я говорю это о 24-ех битном ВМР). Только этА... Там вроде как перевернуто все, в том смысле, что первые 3 значащих байта после шапки - это самый правый нижний пиксель...


Vova   (2004-09-27 12:18:00) [8]

PVOzerski Спасиба за совет!


PVOzerski   (2004-09-27 12:10:00) [9]

Медленный способ:
берешь свойство Canvas.Pixels и из двойного цикла...

Быстрый способ (может, и не лучший, впрочем):
Делаем Bitmap.PixelFormat:=pf24бит. Теперь внутреннее представление картинки будет последовательностью RGB-триплетов. Чтобы было удобно работать, описываю такие типы:
type
tTriplet=packed record
 G,B,R:byte;
end;
tTriplets=array[0..0]of tTriplet;
pTriplets=^tTriplets;
А далее всё тот же двойной цикл, только вместо Pixels работаем с приведенными к типу pTriplets ScanLine'ами.


TUser   (2004-09-27 11:54:00) [10]


> Я открываю файл картинки(BMP) и считую его побитово

Маладец!

> Подскажите пожалуйста в чем тут дело!!!

Delphi понимает исходные коды, а не рассуждения. Мы тоже.

См. ScanLine и иже с ним.


Наверх

Титульная страница Поиск, карта сайта Написать письмо