Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
2-1176330215
proger007
2007-04-12 02:23
2007.04.29
Табуляция в ListBox


1-1172815571
Бригадир
2007-03-02 09:06
2007.04.29
Собственная отрисовка PopupMenu


1-1173168166
Ques
2007-03-06 11:02
2007.04.29
SetErrorMode(SEM_FAILCRITICALERRORS) для приложения


2-1176369807
vlv
2007-04-12 13:23
2007.04.29
Можно ли в Delphi создавать приложения для Windows CE?


2-1176199255
sergeyst
2007-04-10 14:00
2007.04.29
RightClickSelect в TreeView





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