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


Автор: MKsoft 18.10.2007, 01:19
Суть проблемы:
На форме два image-a в одном картинка bmp необходимо из первого вырезать кусок треугольной формы и вставить в конкретное место на втором image

Автор: Alexeis 18.10.2007, 09:43
  Есть такой раздел в MSDN "Clipping Functions" т.е. функции для обрезки. Если при помощи SelectClipRgn назначит регион обрезки рисунку на который нужно копировать, то при копировании на него прямоугольного фрагмента, реально вставиться только то что поместиться в этот регион, а все остальное обрежется. Треугольный регион можно создать функцией CreatePolygonRgn. Получить прямоугольник который охватывает этот треугольник можно функцией GetBoundingBox.

Автор: MKsoft 18.10.2007, 18:37
а примерчик накидать можешь

Автор: MKsoft 18.10.2007, 23:22
Alexeis спасибо большое все получилось

Автор: Alexeis 19.10.2007, 08:24
Цитата(MKsoft @  18.10.2007,  18:37 Найти цитируемый пост)
а примерчик накидать можешь 

  Сорри был занят. Если несложно выложи пример, чтобы другие юзали.

Автор: MKsoft 20.10.2007, 01:27
Пожалуйста
Код

var
  R:integer=255;
  alfa:integer=0;
  betta:integer=0;
  bmp1:TBitmap;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ap: array [1..3] of TPoint;
r: hRGN;

begin
Image2.Canvas.Brush.Color := ClWhite;
Image2.Canvas.FillRect(Canvas.ClipRect);

R:=255;//Длина катетов треугольника
alfa:=0;//Угол поворота треугольника
betta:=30;//угол между катетами

//задаем координаты углов
ap [1] := Point (0, 0);
ap [2] := Point (round(R*cos(alfa*pi/180)), round(R*sin(alfa*pi/180)));
ap [3] := Point (round(R*cos((alfa+betta)*pi/180)), round(R*sin((alfa+betta)*pi/180)));

//создаем вспомогательный Bitmap
bmp1:=TBitmap.Create;
bmp1.Width := Image1.Width;
bmp1.Height := Image1.Height;
bmp1.Canvas.CopyRect(Rect(0, 0, Image1.Width, Height),Image1.Picture.Bitmap.Canvas,Bounds(0, 0, Image1.Width, Height));

//создаем полигон треугольной формы
r:=CreatePolygonRgn(ap, 3, WINDING);
//копируем картинку внутри треугольника
SelectClipRgn(Image2.Canvas.handle, r);
Image2.Canvas.Draw(0, 0, Image1.Picture.Bitmap);
DeleteObject(r);

Image2.canvas.Draw(0, 0, bmp1);
end;

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