我正在使用Mitov的Delphi的IGDIPlus库。
我得到了异常"通用错误"在一个完全无辜的情况下。
我有五个重叠的矩形,并希望使用aPath.outline()
来查找轮廓路径(我在Win7上运行此示例,并应用了所有与轮廓相关的补丁)。
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
函数返回status = 1(通用错误)
因为我真的需要使用轮廓曲线而直接aPath.clone().outline()
因为gdi +错误是不可能的,所以我必须绕过它。合适的解决方案 - 也许不是最好的,但有效 - 可能是:
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;
答案 0 :(得分:0)
如果您使用接口(这个库显然可以使用接口),那么您的行AGraphics.DrawPath(TIGPPen.Create( aclRed,1), ...
在Delphi世界中是危险的。 Delphi在函数调用中引用计数和对象创建时遇到一些问题(虽然我不记得......)。尝试不在函数调用中创建对象,而是定义一个新的局部变量保存对接口的引用。