Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

Как проверить пустой ли битмап?   Найти похожие ветки 

 
tytus ©   (2007-03-06 14:33) [0]

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


 
Джо ©   (2007-03-06 14:39) [1]

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


 
tytus ©   (2007-03-06 14:46) [2]

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:48) [3]

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

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


 
Джо ©   (2007-03-06 14:54) [4]

Вот набросал простой (и медленный) вариант с 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 будет много быстрее.


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

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


 
tytus ©   (2007-03-06 15:02) [6]

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


 
Джо ©   (2007-03-06 15:03) [7]

> [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:06) [8]

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


 
Джо ©   (2007-03-06 15:20) [9]

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

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:36) [10]

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


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

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


 
Джо ©   (2007-03-06 16:50) [12]

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.04.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
8-1155648360
Deka
2006-08-15 17:26
2007.04.29
Подскажите по DSPack. Разбираться нет времени - проект горит.


15-1175409027
Roman_S
2007-04-01 10:30
2007.04.29
Новый компонент без описания и комментариев


2-1176116047
Steep
2007-04-09 14:54
2007.04.29
Че-то совсем туплю..


2-1176365667
dzhagr
2007-04-12 12:14
2007.04.29
TDBGrid


15-1175711002
Kostafey
2007-04-04 22:23
2007.04.29
Что за баг такой странный: Circular datalinks are not allowed.