C# 快速图形绘制图像
我已经运行了这段代码,它所做的是流式传输一个RDLC文件,将其转换为图像并保存。流是在手之前创建的,并保存在内存中。 我面临的问题是这个函数非常慢。执行需要2-3秒。 执行这一行花费的时间最多C# 快速图形绘制图像,c#,graphics,drawimage,C#,Graphics,Drawimage,我已经运行了这段代码,它所做的是流式传输一个RDLC文件,将其转换为图像并保存。流是在手之前创建的,并保存在内存中。 我面临的问题是这个函数非常慢。执行需要2-3秒。 执行这一行花费的时间最多 graphics.DrawImage(imge, adjustedRect); 大多数。我怎样才能使它更快请帮忙 public void PrintImagePage(int PageNo) { try { Metafi
graphics.DrawImage(imge, adjustedRect);
大多数。我怎样才能使它更快请帮忙
public void PrintImagePage(int PageNo)
{
try
{
Metafile imge;
Graphics graphics;
Image pageImage;
PageNo = PageNo - 1;
if (m_streams == null || m_streams.Count == 0)
throw new Exception("Error: no stream to print.");
m_streams[PageNo].Position = 0;
string filePath = _folderPath + _fileNamePrifix + PageNo + ".png";
imge = new Metafile(m_streams[PageNo]);
pageImage = new Bitmap(imge.Width, imge.Height);
graphics = Graphics.FromImage(pageImage);
Rectangle adjustedRect = new Rectangle(
0,
0,
pageImage.Width,
pageImage.Height);
graphics.FillRectangle(Brushes.White, adjustedRect);
// Draw the report content
graphics.DrawImage(imge, adjustedRect);
pageImage = ResizeBitmap(pageImage, .35f, InterpolationMode.HighQualityBicubic);
pageImage.Save(filePath, ImageFormat.Png);
//using (var m = new MemoryStream())
//{
// pageImage.Save(filePath, ImageFormat.Png);
// var img = Image.FromStream(m);
// img.Save(filePath);
// img.Dispose();
//}
imge.Dispose();
graphics.Dispose();
pageImage.Dispose();
}
catch (Exception)
{
throw;
}
}
至于你的问题,不,我认为没有办法加快图形课程的速度 我以前没有使用过图元文件,所以我真的不知道什么是快的和慢的。但据我所知,它基于以前所做的绘制操作(比如在某些客户机上)重新创建了一个图像 难道不是图元文件中有很多绘制操作吗?所以,也许这是一个更好的解决方案,只需在客户机上动态创建图像,然后发送图像
[编辑]或者不使用Graphics类创建自己的?[/edit]哦,我明白了。如果您正在处理非常大的图像。你实际上是
pageImage=新位图(imge.Width*0.35f,imge.Height*0.35f)代码>
并删除调整大小代码
//pageImage=ResizeBitmap(pageImage.35f,InterpolationMode.HighQualityBicubic)代码>
如果这不能解决您的问题,则意味着您的图元文件太复杂,无法渲染。在这种情况下,缓慢的DrawImage
是不可避免的。你可以考虑一些推测技术(在需要之前猜测和渲染图像)来覆盖这个函数的潜伏期。 < P>你可以使用图形内置的变换和再采样特征把它画成更小的RcT.
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
float scale = 0.35f;
graphics.Transform = new System.Drawing.Drawing2D.Matrix(scale, 0.0f, 0.0f, scale, 0.0f, 0.0f);
这将允许您使用相同的绘制调用将较大的图像绘制为较小的图像:
graphics.DrawImage(imge, adjustedRect);
变换是2x2矩阵和位置偏移。通过将矩阵的左上角和右下角元素设置为比例,可以创建比例变换。这样可以尽快完成重新调整大小。这样就不需要第二次复制/重新调整大小。我记得该功能只是快速启动。你正在处理非常大的图像吗?是的,原始图像非常大。这就是为什么我在存钱之前调整它的大小只是不调整大小。首先,将其创建为正确的大小,并在DrawImage()上保存循环。获取匹配的像素格式非常重要。如果你想让它更快,那么你需要满足于更小的插值模式。我正试图用大格式多页Tiff文件(600dpi扫描,3000px+x250px+每帧)来克服这个速度问题。你有没有发现有效的优化?这个线程帮助我减少了30%的绘图时间,但我仍然需要更高的性能。imge=new Metafile(m_streams[PageNo]);有一个由reporting tool创建的流,然后放在一个新的元文件上——可能先将该流下载到memorystream中,然后基于该memorystream创建图像?可能I/O要花很多时间。(这里只是猜测;)