我已经运行了这个代码,它运行的是RDLC文件,将其转换为图像并保存。流是在手工创建并保存在内存中的。 我面临的问题是这个功能很慢。执行需要2-3秒。 执行此行需要花费大部分时间
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;
}
}
答案 0 :(得分:1)
关于你的问题,不,我认为没有办法加速Graphics类。
之前我没有使用过Metafiles,所以我真的不知道什么是快速和慢速的。但据我所知,它会根据之前完成的绘制操作重新创建一个图像(比如在某些客户端或某些东西上)。
难道不是你的Metafile里面有很多抽奖操作吗?所以也许这是一个更好的解决方案,只需在您的客户端即时创建图像,然后只是发送图像?
[edit]或者不要使用Graphics类并创建自己的?[/ edit]
答案 1 :(得分:1)
哦,我明白了。如果您正在处理非常大的图像。你实际上是
我建议您只需一步将其转换为较小的位图。
pageImage = new Bitmap(imge.Width * 0.35f, imge.Height * 0.35f);
并删除调整大小代码
//pageImage = ResizeBitmap(pageImage, .35f, InterpolationMode.HighQualityBicubic);
如果这无法解决您的问题,则意味着您的图元文件太复杂而无法呈现。在这种情况下,慢DrawImage
是不可避免的。您可以考虑一些推测技术(在需要之前猜测并渲染图像)以覆盖此函数的延迟。
答案 2 :(得分:1)
您可以使用Graphics的内置变换和重新采样功能将其绘制到较小的矩形。
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矩阵和位置偏移。通过将矩阵的左上角和右下角元素设置为缩放,您可以创建缩放变换。这样,重新调整大小尽快完成。这消除了对第二次复制/重新调整大小的需要。