3

TMetafile イメージを少なくとも 90 度ずつ回転させる必要があります。メタファイルをビットマップ キャンバスに描画し、ビットマップを回転することで簡単に回転できますが、ベクター イメージ形式で保持することをお勧めします。これはまったく可能ですか?はいの場合、どうすればそれを行うことができますか?

4

3 に答える 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 に答える