Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как проверить пустой ли битмап? [D7, WinXP]


tytus ©   (2007-03-06 14:33:00) 

Допустим, в Paint-е создал новый рисунок, размером 100Х100 (неважно) и сохранил его в формате *.bmp. Нужно проверить пустой ли рисунок, или на нем есть хотя-бы одна точка (пустой - белый цвет...).


Джо   (2007-03-06 16:50:00) [1]

> [11] Юрий Зотов ©   (06.03.07 16:33)
> Не уверен на все 100, но навскидку вспоминается, что есть
> готовый метод Empy.

Есть такое свойство. Но его поведение не соответствует ТЗ, определенному в [0] tytus ©.


Юрий Зотов   (2007-03-06 16:33:00) [2]

Не уверен на все 100, но навскидку вспоминается, что есть готовый метод Empy.


tytus   (2007-03-06 15:36:00) [3]

>Джо ©   (06.03.07 15:20) [9]
Спасибо!


Джо   (2007-03-06 15:20:00) [4]

Вот набросок, дорабатывай.

function IsBitmapEmpty2 (Bmp: TBitmap; EmptyColor: TColor = clWhite): Boolean;
var
 X,
 Y: Integer;
 TempBmp: TBitmap;
 P: ^DWord;
begin
 Result := True;

 TempBmp := TBitmap.Create;
 try
   TempBmp.Assign (Bmp);
   TempBmp.PixelFormat := pf32bit;
   for Y := 0 to TempBmp.Height-1 do
   begin
     P := TempBmp.ScanLine[Y];
     for X := 0 to TempBmp.Width-1 do
     begin
       if DWord(ColorToRGB(EmptyColor)) <> P^ then
       begin
         Result := False;
         Exit;
       end;
       Inc (P);
     end;
   end;

 finally
   TempBmp.Free;
 end;
end;


tytus   (2007-03-06 15:06:00) [5]

>Джо ©   (06.03.07 15:03) [7]
Спасибо и за это....
ВОПРОС ОСТАЕТСЯ ОТКРЫТЫМ!!!!!!!!!!!!
ПРИГЛАШАЮТСЯ ВСЕ !!!


Джо   (2007-03-06 15:03:00) [6]

> [6] tytus ©   (06.03.07 15:02)
> >Джо ©   (06.03.07 14:54) [4]
> Со ScanLine будет много быстрее.
> Пожалуйста.

Не имею времени.

И, кстати, в моем примере цикл нужно до Bmp.Width-1 и Bmp.Height-1.


tytus   (2007-03-06 15:02:00) [7]

>Джо ©   (06.03.07 14:54) [4]
Со ScanLine будет много быстрее.
Пожалуйста.
С пикселями и так все понятно.


tytus   (2007-03-06 15:00:00) [8]

Мне нужно с канвы DeskTop-a (aDC:=GetDC(0)) - содрать часть изображения и проверить - пустое ли оно или нет (в данном случае - это Image на форме).
В данной ф-и координатами (вх. параметры) задаем проверяемую область.
Создаем битмап, размером x2-x1 и y2-y1.
Копируем в битмап - первая BitBlt.
Затем нужно проверить - пустой ли он  - как раз в цикле + ScanLine.
И в конце скопировать битмап на форму - вторая BitBlt.
Вот. А как проверить цвет пикселя из Bmp.ScanLine???
Вариантов было много, поэтому и задал вопрос
if cl^[i]=$00FFFFFF - один из вариантов - не помог....


Джо   (2007-03-06 14:54:00) [9]

Вот набросал простой (и медленный) вариант с Canvas.Pixels, должен работать, но не проверял.

function IsBitmapEmpty (Bmp: TBitmap; EmptyColor: TColor = clWhite): Boolean;
var
 X,
 Y: Integer;
begin
 Result := True;
 for X := 0 to Bmp.Width do
   for Y := 0 to Bmp.Height do
     if Bmp.Canvas.Pixels[X,Y] <> EmptyColor then
     begin
       Result := False;
       Exit
     end;
end;


Со ScanLine будет много быстрее.


Джо   (2007-03-06 14:48:00) [10]

> Вот, а что дальше незнаю....

Я вообще слабо понимаю смысл приведенного куска исходника.


tytus   (2007-03-06 14:46:00) [11]

function TMainFm.CheckBitMap(x1,y1,x2,y2:integer):boolean;
var
 Bmp:Graphics.TBitMap;
 cl:PByteArray;
 pix:boolean;
 i,j:integer;
 aDC:HDC;
begin
 aDC:=GetDC(0);
 pix:=false;
 Bmp:=Graphics.TBitmap.Create;
 Bmp.Width:=x2-x1;
 Bmp.Height:=y2-y1;
 BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,aDC,x1,y1,SRCCOPY);
 ReleaseDC(0,aDC);
 for j:=0 to Bmp.Height-1 do
   begin
     if pix then Break;
     cl:=Bmp.ScanLine[j];
     for i:=0 to Bmp.Width-1 do
     begin
       if cl^[i]..... {тут нужно что-то делать}
     end;
   end;
BitBlt(Canvas.Handle,x1,8,Bmp.Width,Bmp.Height,Bmp.Canvas.Handle,0,0,SRCCOPY);
Bmp.Dormant;
Bmp.FreeImage;
Bmp.ReleaseHandle;
Bmp.Free;
Result:=pix;
end;

Вот, а что дальше незнаю....


Джо   (2007-03-06 14:39:00) [12]

Цикл по Pixels (медленно).
Цикл по ScanLine (гораздо быстрее).


Наверх

Титульная страница Поиск, карта сайта Написать письмо