Текущий архив: 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.47 MB
Время: 0.023 c