Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Вырезать область векторной картинки из TMetaFile


Автор: Delphist 25.8.2006, 11:47
У меня есть TMetaFile, который содержит векторную картинку как мне из него вырезать кусок с заданными размерами и разместить в новом TMetaFile (можно и в этом же) - т.е. задача свелась к обрезанию не нужной части векторного рисунка.

Автор: bems 25.8.2006, 18:08
Область прямоугольная?

Автор: Delphist 28.8.2006, 07:44
Цитата(bems @ 25.8.2006,  19:08)
Область прямоугольная?

Да

Автор: Alexeis 28.8.2006, 07:52
Delphist, CopyRect, области пробовал? После копирования провести заливку, того же прямоугольника белым (отуда откуда коприровали) цветом.

Автор: Delphist 28.8.2006, 08:15
Цитата(alexeis1 @ 28.8.2006,  08:52)
Delphist, CopyRect, области пробовал? После копирования провести заливку, того же прямоугольника белым (отуда откуда коприровали) цветом.

CopyRect пробовал не помог (правда я заливку белым цветом не делал). А как вообще сделать заливку это же вектор.

Автор: Alexeis 28.8.2006, 09:59
Delphist, с TMetaFile полная беда, он позволяет только рисовать, на поверхности. Изображение возвращает только ч/з Metafile. А вот ничего стороннего я не нашел...

Добавлено @ 09:59 
По крайней мере бесплатого.

Автор: Girder 29.8.2006, 01:41
Вариант:
Код

procedure TForm1.Button1Click(Sender: TObject);
var Rgn:HRGN;
    s:TMetafile;
begin
 s:=TMetaFile.Create;
 s.Width:=500;
 s.Height:=500;
 Rgn:=CreateRectRgn(-10,-10,250,250);
 with TMetafileCanvas.Create(s,0) do
 try
  SetViewportOrgEx(Handle,-10,-10,nil);
  SelectClipRgn(Handle,Rgn);
  Brush.Color:=clWhite;
  Rectangle(0,0,100,100);
  Ellipse(100,100,200,200);
  Ellipse(200,200,300,300);
  Ellipse(300,300,400,400);
  Rectangle(400,400,500,500);
  SelectClipRgn(Handle,0);
 finally
  Free;
  DeleteObject(Rgn);
 end;
 Image1.Picture.Metafile:=s;
end;


Вариант:
Код

procedure TForm1.Button2Click(Sender: TObject);
var s,d:TMetafile;
    i:integer;
begin
 Image1.AutoSize:=true;
 s:=TMetaFile.Create;
 s.Width:=500;
 s.Height:=500;
 with TMetafileCanvas.Create(s,0) do
 try
  Brush.Color := clWhite;
  Rectangle(0,0,100,100);
  Ellipse(100,100,200,200);
  Ellipse(200,200,300,300);
  Ellipse(300,300,400,400);
  Rectangle(400,400,500,500);
 finally
  Free;
 end;
 d:=TMetafile.Create;
 d.Width:=250;
 d.Height:=250;
 i:=0;
 repeat
  with TMetafileCanvas.Create(d,0) do
  try
   d.Clear;
   SetViewportOrgEx(Handle,-i,-i,nil);
   PlayEnhMetaFile(Handle,s.Handle,Rect(0,0,s.Width,s.Height));
  finally
   Free;
  end;
  Image1.Picture.Metafile:=d;
  Application.ProcessMessages;
  sleep(10);
  inc(i);
 until (i=250);
end;


И т.д. и т.п.

Автор: Delphist 29.8.2006, 07:58
Girder скажи, пожалуйтса, два твоих варианта это одно целое или это два варианта решающие одну и туже задачу, но разными способами. 
И еще одна просьба не мог бы прокоментировать свои варианы.

Автор: Alexeis 29.8.2006, 09:01
Ух ты! браво Girder ограничил область вывода.  Сверху и слева
Код

SetViewportOrgEx(Handle,-10,-10,nil);

Справа и снизу прямоугольным регионом 
Код

Rgn:=CreateRectRgn(-10,-10,250,250);
...............................
SelectClipRgn(Handle,Rgn);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)