Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.036 c
4-1094658891
Davinchi
2004-09-08 19:54
2004.10.10
Не получается отслеживать изменение буфера обмена


1-1096038625
mmmmm
2004-09-24 19:10
2004.10.10
перебор все компонентов image


1-1095613929
Evg12
2004-09-19 21:12
2004.10.10
Как читать стима строками.


14-1095452403
Chess
2004-09-18 00:20
2004.10.10
Unicode to RichEdit


14-1096000394
SiJack
2004-09-24 08:33
2004.10.10
Доброе утро!!! Не подскажете чем





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский