Главная страница
    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.068 c
4-1094813599
Чебуратор
2004-09-10 14:53
2004.10.10
Быстро передать файл клиенту через сервер приложений (MIDAS)?


4-1094027322
SkyRanger
2004-09-01 12:28
2004.10.10
Нажатие кнопки в окне другого приложения


14-1095832509
Mrd
2004-09-22 09:55
2004.10.10
Исходник браузера


14-1095750324
X9
2004-09-21 11:05
2004.10.10
Подстрочный символ (Цифра) в TLabel


3-1095154874
12345
2004-09-14 13:41
2004.10.10
Можно ли менять содержимое таблицы, если менятьг грид ADOQuery?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский