0

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

        }
    }

我在哪里可以改进?

4

2 回答 2

2

您使用的是Magick.NET而不是 ImageMagick.NET。

在将位图发送到输出流之前,无需创建位图。你可以这样做:

using (MagickImage vertical=images.AppendVertically())
{
  vertical.Format = MagickFormat.Jpeg;
  vertical.Write(context.Response.OutputStream);
}

也许您应该将结果缓存到文件中?

于 2013-10-31T12:10:09.813 回答
2

如果你决定使用 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 生成图像。

于 2017-11-29T09:22:56.757 回答