我正在使用ImageMagick.NET从pdf生成图片。它的工作,但转换过程太慢。代码 - >
public void ProcessRequest(HttpContext context)
{
if (context.Request["id"] != null)
{
string id = context.Request["id"].ToString();
MagickReadSettings settings = new MagickReadSettings();
settings.Density = new MagickGeometry(300, 300);
using (MagickImageCollection images = new MagickImageCollection())
{
images.Read(System.Web.HttpContext.Current.Server.MapPath(string.Format("~/Reciepts/order{0}.pdf", id)), settings);
MagickImage vertical= images.AppendVertically();
using (var memoryStream = new MemoryStream())
{
vertical.ToBitmap().Save(memoryStream, ImageFormat.Jpeg);
var d = memoryStream.GetBuffer();
context.Response.Clear();
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(d);
context.Response.End();
}
}
}
}
我可以改进的地方?
答案 0 :(得分:2)
您正在使用Magick.NET而不是ImageMagick.NET。
在将位图发送到输出流之前,不必创建位图。你可以这样做:
using (MagickImage vertical=images.AppendVertically())
{
vertical.Format = MagickFormat.Jpeg;
vertical.Write(context.Response.OutputStream);
}
也许您应该将结果缓存到文件中?
答案 1 :(得分:1)
如果您决定使用Magick.NET,方法没有错。
第一个答案给你"使用" MagickImage
的陈述。
但这只有几毫秒的时间来完成这项工作。
我看到慢线是这一行:
images.Read(System.Web.HttpContext.Current.
Server.MapPath(string.Format("~/Reciepts/order{0}.pdf", id)), settings);
因为设置对象属性。 您的属性表示图像必须为300dpi,300可能对您的CPU非常高:
settings.Density = new MagickGeometry(300, 300);
您可以尝试使用较低的密度,而不是300dpi。密度越低越快:
settings.Density = new Density(72, 72);
我认为必须有另一种快速方法从pdf文件创建图像。 Magick.NET使用Ghostscript从pdf生成图像,Ghostscript很慢,有时不能成功从复杂的(分层的)pdf生成图像。