私はDelphi用のMitovのIGDIPlusライブラリを使用しています。 完全に無邪気な状況で例外「汎用エラー」が発生します。 私は5つのオーバーラップする四角形を持ち、アウトラインパスを見つけるのにaPath.outline()
を使いたいと思います(私はこの例をWin7で実行していますが、すべてのアウトライン関連のパッチが適用されています)。gdiplus Path GdipWindingModeOutline problems
uses
System.Types, IGDIPlus, VCL.IGDIPlusExt;
procedure TForm1.FormPaint(Sender: TObject);
var
AGraphics : IGPGraphics;
APath,aPathO : IGPGraphicsPath;
begin
AGraphics := TIGPGraphics.Create(Canvas);
AGraphics.SmoothingMode := SmoothingModeAntiAlias;
AGraphics.TextRenderingHint := TextRenderingHintAntiAlias;
aPath := TIGPGraphicsPath.create() ;
// this path gives generic error
aPath.addRectangle(73,201,108,96);
// --------the difference----------
aPath.addRectangle(73,292,58,96);
// --------the difference----------
aPath.addRectangle(73,383,108,96);
aPath.addRectangle(177,201,108,96);
aPath.addRectangle(177,383,108,96);
try
aPathO := apath.clone().Outline();
AGraphics.DrawPath(TIGPPen.Create(aclRed,1),
aPathO);
except
on E: Exception do
begin
AGraphics.DrawStringF(e.message,
TIGPFont.Create('Microsoft Sans Serif', 16, [ fsBold ]),
TPointF.Create(23, 23),
TIGPSolidBrush.Create(aclRed)) ;
AGraphics.DrawPath(TIGPPen.Create(aclRed,1),
aPath);
end;
end;
aPath.reset();
// this path works fine
aPath.addRectangle(373,201,108,96);
// --------the difference----------
aPath.addRectangle(373,292,108,96);
// --------the difference----------
aPath.addRectangle(373,383,108,96);
aPath.addRectangle(477,201,108,96);
aPath.addRectangle(477,383,108,96);
try
aPathO := apath.clone().Outline();
AGraphics.DrawPath(TIGPPen.Create(aclRed,1),
aPathO);
AGraphics.DrawStringF('it works',
TIGPFont.Create('Microsoft Sans Serif', 16, [ fsBold ]),
TPointF.Create(423, 23),
TIGPSolidBrush.Create(aclRed)) ;
except
on E: Exception do
begin
AGraphics.DrawStringF(e.message,
TIGPFont.Create('Microsoft Sans Serif', 16, [ fsBold ]),
TPointF.Create(223, 23),
TIGPSolidBrush.Create(aclRed)) ;
AGraphics.DrawPath(TIGPPen.Create(aclRed,1),
aPath);
end;
end;
end;
ご意見、ご提案は大歓迎です。 C#で同じ例を実行
は(Outline a path with GDI+ in .Netを使用して)同じエラーを与える
GraphicsPath aPath = new GraphicsPath();
aPath.AddRectangle(new Rectangle(73, 201, 108, 96));
aPath.AddRectangle(new Rectangle(73, 292, 58, 96));
aPath.AddRectangle(new Rectangle(73, 383, 108, 96));
aPath.AddRectangle(new Rectangle(177, 201, 108, 96));
aPath.AddRectangle(new Rectangle(177, 383, 108, 96));
HandleRef handle = new HandleRef(aPath, (IntPtr)aPath.GetType().GetField("nativePath", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(aPath));
try
{
int status = GdipWindingModeOutline(handle, IntPtr.Zero, 0.25F);
using (Pen outlinePen = new Pen(Color.FromArgb(255, Color.Red), 2))
{
g.DrawPath(outlinePen, aPath);
}
}
catch (Exception exp)
{ ...
}
GdipWindingModeOutline
関数は= 1(一般エラー)ステータスを返し
私は本当にアウトライン曲線を使用する必要があるためと直接の方法aPath.clone().outline()
gdi +エラーが不可能なため、私はarroundに行く必要があります。適切な解決策 - おそらくない最高のが、作品は - かもしれない:あなたは(このライブラリは明らかにない)インタフェースを使用する場合
procedure TForm1.FormPaint(Sender: TObject);
var
AGraphics : IGPGraphics;
APath,aPathO : IGPGraphicsPath;
aRegion : IGPRegion;
aScan : TArray;
aMatrix : IGPmatrix;
begin
AGraphics := TIGPGraphics.Create(Canvas);
AGraphics.SmoothingMode := SmoothingModeAntiAlias;
AGraphics.TextRenderingHint := TextRenderingHintAntiAlias;
aPath := TIGPGraphicsPath.create() ;
aRegion := TIGPRegion.create().MakeEmpty();
aRegion.Union( TIGPRect.create(73,201,108,96));
aRegion.Union( TIGPRect.create(73,292,58,96));
aRegion.Union( TIGPRect.create(73,383,108,96));
aRegion.Union( TIGPRect.create(177,201,108,96));
aRegion.Union( TIGPRect.create(177,383,108,96));
aMatrix := TIGPMatrix.Create();
aScan := lRegion.GetRegionScans(aMatrix);
for i := 0 to High(aScan) do
aPath.addRectangle(GPInflateRect(aScan[i], 1));
aPathO := aPath.Clone().Outline();
AGraphics.DrawPath(TIGPPen.Create(aclRed,1), aPathO);
end;
いいえ、問題はこの行にありません(コードはMitovデモに基づいています)。 'aPathO:= apath.clone()。Outline(); '誰かが同じような例をC#または別の言語で実行しようとした場合に役立ちます – EvaF