ImageMagick Pdf到图像转换太慢了

时间:2013-10-30 14:09:44

标签: c# imagemagick magick.net

我正在使用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();
                }
            }

        }
    }

我可以改进的地方?

2 个答案:

答案 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生成图像。