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

Вниз

Помогите подщитать количество пикселей в рисунке   Найти похожие ветки 

 
Vova   (2004-09-27 11:50) [0]

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

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


 
TUser ©   (2004-09-27 11:54) [1]


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

Маладец!

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

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

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


 
PVOzerski ©   (2004-09-27 12:10) [2]

Медленный способ:
берешь свойство 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"ами.


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

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


 
Cosinus ©   (2004-09-27 12:19) [4]

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


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

код вот какой
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);


 
PVOzerski ©   (2004-09-27 12:47) [6]

А наподобие такого не подойдет?
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;


 
TUser ©   (2004-09-27 12:50) [7]


> Vova   (27.09.04 12:32) [5]

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


 
PVOzerski ©   (2004-09-27 12:50) [8]

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

> 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

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


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

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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.028 c
14-1095948626
Nikolay M.
2004-09-23 18:10
2004.10.10
Масяня вернулась!


4-1094711149
UNIVERSAL
2004-09-09 10:25
2004.10.10
Окно поверх всех окон - проблема(+)


4-1094129994
Lola
2004-09-02 16:59
2004.10.10
Контроль за отправленной и входящей почтой.


3-1095062423
Vir
2004-09-13 12:00
2004.10.10
ClientDataSet


3-1095167605
lehich
2004-09-14 17:13
2004.10.10
ADODataSet киньте примерчик