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

Вниз

Размеры изображения   Найти похожие ветки 

 
lewka ©   (2010-02-06 11:42) [0]

Привет!!! Подскажите, пожалуйста, в такой задачке: Есть картинка неизвестных размеров, загруженная в TImage. Картинка монохромная (только черные и белые точки на ней). Подскажите как убрать белые поля вокруг картинки, чтобы была только одна картинка без белых полей? Спасибо


 
lewka ©   (2010-02-06 11:59) [1]

Вот мой код:
Image1.Picture.LoadFromFile("123.bmp");
Left := 0;
Top := 0;
Right := Width-1;
Bottom := Height;
//левая точка
for X := Left to Right do
for Y := Top to Bottom do
 if  Image1.Picture.Bitmap.Canvas.Pixels[x,y] = clBlack then begin
   Left := X;
   Exit;
 end;
 //правая точка
for X := Left to Right do begin
 Count := 0;
 for Y := Top to Bottom do
   if Image1.Picture.Bitmap.Canvas.Pixels[x,y] = clBlack then Inc(Count);
 if Count = 0 then begin
   Right := X-1;
   Exit;
 end;
end;
// верхняя точка
for Y := Top to Bottom do
for X := Left to Right do
 if Image1.Picture.Bitmap.Canvas.Pixels[x,y] = clBlack then begin
   Top := Y;
   Exit;
 end;
// нижняя точка
for Y := Top to Bottom do begin
 Count := 0;
 for X := Left to Right do
   if Image1.Picture.Bitmap.Canvas.Pixels[x,y] = clBlack then Inc(Count);
 if Count = 0 then begin
   Bottom := Y-1;
   Exit;
 end;
end;
Image1.Picture.Bitmap.Width:=abs(Right-Left);
Image1.Picture.Bitmap.Height:=abs(Bottom-Top);
Image1.Picture.Bitmap.SaveToFile("123.bmp");

но ни чего не происходит


 
И Павел   (2010-02-06 13:11) [2]

Может быть я чего-то недопонял, но у меня и монохромный рисунок при Transparent=true делается прозрачным.


 
И Павел   (2010-02-06 13:21) [3]

Теперь, кажется, понял :) Попробуйте BrushCopy.

Как вариант - ScanLine+рисование еще одного изображения. Но это медленно.


 
icWasya ©   (2010-02-08 13:20) [4]

Во первых EXIT - это выход из процедуры, а не из цикла.
Поскольку нет возможности выхода одновременно из двух циклов,
то нужно или использовать GOTO, или оформлять циклы в процедуры, например так

procedure ResizeBMP(FileName:String);
var
 BMP,BMP2:TBitmap;
 Ok:Boolean;
 Left,Right,Top,Bottom :Integer;
 Source,Dest:TRect;
 procedure FindLeft;  //левая точка
 var X,Y:Integer;
 begin
 for X := Left to Right do
   for Y := Top to Bottom do
     if BMP.Canvas.Pixels[x,y] = clBlack then begin
       Left := X;
       Ok:=True;
       Exit;
     end;
 end;
 procedure FindRight;  //правая точка
 var X,Y:Integer;
 begin
 for X := Right downto Left do
   for Y := Top to Bottom do
     if BMP.Canvas.Pixels[x,y] = clBlack then begin
       Right := X;
       Ok:=True;
       Exit;
     end;
 end;
 procedure FindTop; // верхняя точка
 var X,Y:Integer;
 begin
 for Y := Top to Bottom do
   for X := Left to Right do
     if BMP.Canvas.Pixels[x,y] = clBlack then begin
       Top := Y;
       Ok:=True;
       Exit;
     end;
 end;
 procedure FindBottom; // нижняя точка
 var X,Y:Integer;
 begin
 for Y := Bottom downto Top do
   for X := Left to Right do
     if BMP.Canvas.Pixels[x,y] = clBlack then begin
       Bottom := Y;
       Ok:=True;
       Exit;
     end;
 end;
begin
 BMP:=TBitmap.Create;
 try
   Ok:=False;
   BMP.LoadFromFile(FileName);
   Left := 0;
   Top := 0;
   Right := BMP.Width-1;
   Bottom := BMP.Height-1;
   FindLeft;
   FindRight;
   FindTop;
   FindBottom;
   if not Ok then begin
     ShowMessage("в файле "" + filename +"" нет чёрных точек");
     Exit;
   end;
   // теперь надо скопировать найденную область в новую Bitmap
   Source.Left:=Left;
   Source.Top:=Top;
   Source.Right:=Right;
   Source.Bottom:=Bottom;
   Dest.Left:=0;
   Dest.Top:=0;
   Dest.Right:=Right-Left;
   Dest.Bottom:=Bottom-Top;

   // сформируем новую битмапу
   BMP2:=TBitmap.Create;
   try
     BMP2.Palette:=BMP.Palette;
     BMP2.Width:=Right-Left+1;
     BMP2.Height:=Bottom-Top+1;

     BMP2.Canvas.CopyRect(Dest,BMP.Canvas,Source);

     BMP2.SaveToFile(FileName);
   finally
     BMP2.Free
   end;
 finally
   BMP.Free;
 end;
end;


 
icWasya ©   (2010-02-08 13:25) [5]

В догонку
нужно еще одно присваивание

     BMP2.PixelFormat:=BMP.PixelFormat;


 
anonims   (2010-02-08 14:09) [6]

Поскольку нет возможности выхода одновременно из двух циклов,

но есть возможность указать что циклы пора заканчивать
stop:=true;// один раз

if stop then break; //нужное число раз (=кол-во циклов) в нужных местах


 
KilkennyCat ©   (2010-02-08 17:32) [7]

имеем массив А размерностью AX, AY
найти область Rect

rect := TRect(AX,AY,0,0);
for i := 0 to AX do
 for y := 0 to AY do
   if A(x,y) = 1 then begin
     if x > rect.right then rect.right := x;
     if x < rect.left then rect.left := x;
     if y > rect.bottom then rect.bottom := y;
     if y < rect.top then rect.top := y;
   end;


Собственно, все. Возможно, что-то упустил, но общий алгоритм должен быть ясен, как и то, как присобачить рект к битмапу.


 
KilkennyCat ©   (2010-02-08 17:34) [8]

В случае использования скайнлайна алгоритм исчо просчее и быстрее, но это уже сами думайте, я спать хочу.


 
KilkennyCat ©   (2010-02-08 17:37) [9]

for i := 0 читать как for x := 0



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

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.084 c
4-1238744433
SunSh@dow
2009-04-03 11:40
2010.08.27
выключить монитор


2-1274643123
RWolf
2010-05-23 23:32
2010.08.27
Выполнить код при завершении программы


15-1271746918
JohnKorsh
2010-04-20 11:01
2010.08.27
4 ядра в XP SP3.


2-1265975826
ExGen
2010-02-12 14:57
2010.08.27
ADOTable


2-1270059753
Perseus
2010-03-31 22:22
2010.08.27
Алгоритмы и типы





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