![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите подщитать количество пикселей в рисунке [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 и иже с ним.