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

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

Как разрезать рисунок? [D6, D7, WinXP]


Volf_555 ©   (2005-10-29 22:25:00) 

Есть много рисунков одинакого размера (ширина, высота), надо каждый рисунок разрезать на 5 равных частей и каждую часть сохранить в файлы. Как это осуществить?


Zeqfreed   (2005-10-30 00:46:00) [1]

Volf_555   (29.10.05 23:33) [4]
program cut_bmp;

uses
 Windows,
 SysUtils,
 Classes,
 Graphics;

var
 OriginalBMP : TBitmap;
 i : Integer;
 sc : Integer = 0;

procedure EvalParam(const idx : Integer);
var
 coords : TStrings;
 j : Integer;
 bmp : TBitmap;
 r : TRect;
begin
 coords := TStringList.Create;
 try
  coords.Delimiter := ',';
  coords.DelimitedText := ParamStr(idx);
  if coords.Count < 4 then begin
   MessageBox(0, PChar(Format('Not enough coordinates passed in parameter #%d', [idx])), 'Cut utility', MB_OK or MB_ICONWARNING);
   Exit;
  end;

  try
   r.Left := StrToInt(coords[0]);
   r.Top := StrToInt(coords[1]);
   r.Right := StrToInt(coords[2]);
   r.Bottom := StrToInt(coords[3]);
  except
   MessageBox(0, 'Invalid parameter list passed to the application', 'Cut utility', MB_OK or MB_ICONWARNING);
   Exit;
  end;

  bmp := TBitmap.Create;
  try
   bmp.Width := r.Right - r.Left;
   bmp.Height := r.Bottom - r.Top;
   bmp.PixelFormat := OriginalBMP.PixelFormat;
   bmp.Canvas.CopyRect(bmp.Canvas.ClipRect, OriginalBMP.Canvas, r);
   bmp.SaveToFile(ChangeFileExt(ParamStr(1), '') + '_part' + IntToStr(idx - 1) + '.bmp');

   Inc(sc);
  finally
   bmp.Free;
  end;
 finally
  coords.Free;
 end
end;  

begin
 OriginalBMP := TBitmap.Create;
 if (ParamCount < 2) or not (FileExists(ParamStr(1))) then Exit;

 try
  OriginalBMP.LoadFromFile(ParamStr(1));
  for i := 2 to ParamCount do begin
   EvalParam(i);
  end;

  MessageBox(0, PChar(Format('Image "%s" was succesfully cut into %d pieces', [ParamStr(1), sc])), 'Cut utility', MB_OK or MB_ICONINFORMATION);
 finally
  OriginalBMP.Free;
 end;
end.


Надеюсь пример поможет тебе разобраться.
Синтаксис командной строки такой:
*.bmp (d,d,d,d)*

Например, 1.bmp 0,0,20,20 0,0,20,100 0,20,100,100


Volf_555   (2005-10-29 23:33:00) [2]

Не раздуплюсь как этим воспользоваться...
TCanvas.CopyRect(const Dest:TRect; Canvas:TCanvas;const Source:TRect);

На форме есть Image1-6
В Image1 загружается главный рисунок, в остальные Image_ - результат обработки.

Что мне писать в качестве Dest, Canvas и Source? (Используя ширину и длину копируемого участка)


Zeqfreed   (2005-10-29 22:53:00) [3]

Volf_555   (29.10.05 22:45) [2]
См. BitBlt, TCanvas.CopyRect


Volf_555   (2005-10-29 22:45:00) [4]

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


Desdechado   (2005-10-29 22:31:00) [5]

Равных по какому признаку? По площади? Или по форме? Прямоугольники или еще что?


Наверх

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