Форум: "Основная";
Текущий архив: 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.04 c