TMetafile イメージを少なくとも 90 度ずつ回転させる必要があります。メタファイルをビットマップ キャンバスに描画し、ビットマップを回転することで簡単に回転できますが、ベクター イメージ形式で保持することをお勧めします。これはまったく可能ですか?はいの場合、どうすればそれを行うことができますか?
1976 次
3 に答える
4
2 番目のメタファイルを作成します。SetWorldTransform を使用して、回転変換を作成します。最初のメタファイルを 2 番目のメタファイルに描画し、後は変換に任せます。
于 2013-11-22T04:47:10.077 に答える
1
David の推奨によって作成された作業コード サンプル。ボタンをクリックするたびに、TImage 内に保存されているメタファイルが 90 度回転します。
procedure TfMain.btnRotateClick(Sender: TObject);
var
SourceMetafile: TMetafile;
DestMetafile: TMetafile;
DestCanvas: TMetafileCanvas;
TransformMatrix: XFORM;
Angle: Double;
begin
Assert(imgRender.Picture.Graphic is TMetafile);
SourceMetafile := imgRender.Picture.Graphic as TMetafile;
DestMetafile := TMetafile.Create();
DestMetafile.Width := SourceMetafile.Height;
DestMetafile.Height := SourceMetafile.Width;
try
DestCanvas := TMetafileCanvas.Create(DestMetafile, Canvas.Handle);
try
SetGraphicsMode(DestCanvas.Handle, GM_ADVANCED);
ZeroMemory(@TransformMatrix, SizeOf(TransformMatrix));
TransformMatrix.eM11 := 1;
TransformMatrix.eM12 := 0;
TransformMatrix.eM21 := 0;
TransformMatrix.eM22 := 1;
TransformMatrix.eDx := -SourceMetafile.Width div 2;
TransformMatrix.eDy := -SourceMetafile.Height div 2;
SetWorldTransform(DestCanvas.Handle, TransformMatrix);
ZeroMemory(@TransformMatrix, SizeOf(TransformMatrix));
Angle := DegToRad(90);
TransformMatrix.eM11 := Cos(Angle);
TransformMatrix.eM12 := Sin(Angle);
TransformMatrix.eM21 := -Sin(Angle);
TransformMatrix.eM22 := Cos(Angle);
TransformMatrix.eDx := 0;
TransformMatrix.eDy := 0;
ModifyWorldTransform(DestCanvas.Handle, TransformMatrix, MWT_RIGHTMULTIPLY);
ZeroMemory(@TransformMatrix, SizeOf(TransformMatrix));
TransformMatrix.eM11 := 1;
TransformMatrix.eM12 := 0;
TransformMatrix.eM21 := 0;
TransformMatrix.eM22 := 1;
TransformMatrix.eDx := SourceMetafile.Height div 2;
TransformMatrix.eDy := SourceMetafile.Width div 2;
ModifyWorldTransform(DestCanvas.Handle, TransformMatrix, MWT_RIGHTMULTIPLY);
DestCanvas.Draw(0, 0, SourceMetafile);
finally
DestCanvas.Free();
end;
imgRender.Picture.Assign(DestMetafile);
finally
DestMetafile.Free();
end;
end;
于 2013-11-22T05:56:28.713 に答える