C# 使用Graphic.DrawLines(钢笔、点)作为图元文件,当点数较大时,图片无法打开
我对GDI+图元文件有问题。我想通过图形保存图元文件。当点计数为10000并且可以打开保存的图元文件时,它工作良好。但当点计数较大(例如计数=10000000)时,mspaint.exe无法打开图元文件 有什么我错过的吗?图元文件记录大小是否有限制?顺便说一下,C# 使用Graphic.DrawLines(钢笔、点)作为图元文件,当点数较大时,图片无法打开,c#,gdi+,metafile,C#,Gdi+,Metafile,我对GDI+图元文件有问题。我想通过图形保存图元文件。当点计数为10000并且可以打开保存的图元文件时,它工作良好。但当点计数较大(例如计数=10000000)时,mspaint.exe无法打开图元文件 有什么我错过的吗?图元文件记录大小是否有限制?顺便说一下,draw矩形也有这个问题 这是我的密码: private void button1_Click(object sender, EventArgs e) { int width = 1489; int heigh
draw矩形
也有这个问题
这是我的密码:
private void button1_Click(object sender, EventArgs e)
{
int width = 1489;
int height = 471;
Graphics offScreenBufferGraphics;
Metafile m;
using (MemoryStream stream = new MemoryStream())
{
using (offScreenBufferGraphics = Graphics.FromHwndInternal(IntPtr.Zero))
{
IntPtr deviceContextHandle = offScreenBufferGraphics.GetHdc();
m = new Metafile(
stream,
deviceContextHandle,
new RectangleF(0, 0, width, height),
MetafileFrameUnit.Pixel,
EmfType.EmfPlusOnly);
offScreenBufferGraphics.ReleaseHdc();
}
}
using (Graphics g = Graphics.FromImage(m))
{
// Set everything to high quality
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
MetafileHeader metafileHeader = m.GetMetafileHeader();
g.ScaleTransform(
metafileHeader.DpiX / g.DpiX,
metafileHeader.DpiY / g.DpiY);
g.PageUnit = GraphicsUnit.Pixel;
g.SetClip(new RectangleF(0, 0, width, height));
// clears the image and colors the entire background
g.Clear(Color.White);
// draw lines
using (Pen pen = new Pen(Color.Black, 1f))
{
Random rnd = new Random(DateTime.Now.Millisecond);
List<PointF> polyPoints = new List<PointF>();
const int count = 10000;
for (int i = 1; i <= 10000000; i++)
{
polyPoints.Add(new PointF(rnd.Next(1000),rnd.Next(1000)));
}
g.DrawLines(pen, polyPoints.ToArray());
// while
} // using
} // using
// Get a handle to the metafile
IntPtr iptrMetafileHandle = m.GetHenhmetafile();
// Export metafile to an image file
CopyEnhMetaFile(iptrMetafileHandle, @"F:\CacheToDisk\test2.emf");
// Delete the metafile from memory
DeleteEnhMetaFile(iptrMetafileHandle);
}
[DllImport("gdi32.dll")]
static extern IntPtr CopyEnhMetaFile( // Copy EMF to file
IntPtr hemfSrc, // Handle to EMF
String lpszFile // File
);
[DllImport("gdi32.dll")]
static extern int DeleteEnhMetaFile( // Delete EMF
IntPtr hemf // Handle to EMF
);
private void按钮1\u单击(对象发送者,事件参数e)
{
整数宽度=1489;
内部高度=471;
图形offScreenBufferGraphics;
元文件m;
使用(MemoryStream stream=new MemoryStream())
{
使用(offScreenBufferGraphics=Graphics.fromHwnInternal(IntPtr.Zero))
{
IntPtr deviceContextHandle=offScreenBufferGraphics.GetHdc();
m=新图元文件(
流动
deviceContextHandle,
新矩形F(0,0,宽度,高度),
MetafileFrameUnit.Pixel,
EmfType.EmfPlusOnly);
offScreenBufferGraphics.ReleaseHdc();
}
}
使用(Graphics g=Graphics.FromImage(m))
{
//把一切都设置为高质量
g、 SmoothingMode=SmoothingMode.HighQuality;
g、 插值模式=插值模式。高质量双三次;
g、 PixelOffsetMode=PixelOffsetMode.HighQuality;
g、 合成质量=合成质量。高质量;
MetafileHeader MetafileHeader=m.GetMetafileHeader();
g、 标度变换(
metafileHeader.DpiX/g.DpiX,
metafileHeader.DpiY/g.DpiY);
g、 PageUnit=GraphicsUnit.Pixel;
g、 SetClip(新矩形F(0,0,宽度,高度));
//清除图像并为整个背景着色
g、 清晰(颜色:白色);
//划线
使用(钢笔=新钢笔(颜色:黑色,1f))
{
Random rnd=新随机(DateTime.Now.毫秒);
列表多点=新列表();
常数整数计数=10000;
对于(int i=1;i这似乎是一个限制。如果我使用DrawPath而不是DrawLines,它会正常工作