1

我已经让这段代码运行它的作用是流式传输 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;
        }
    }
4

3 回答 3

1

至于你的问题,不,我认为没有办法加快 Graphics 类。

我以前没有使用过元文件,所以我真的不知道什么是快什么是慢。但据我所知,它会根据之前完成的绘制操作(例如在某些客户端或其他东西上)重新创建图像。

难道你的元文件里面有很多绘制操作吗?所以也许它是一个更好的解决方案,只是在你的客户上即时创建图像,然后发送图像?

[编辑]或者不使用图形类并创建自己的?[/编辑]

于 2013-05-29T13:42:38.213 回答
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 矩阵和一个位置偏移量。通过将矩阵的左上角和右下角元素设置为比例,您已经创建了比例变换。这样,重新调整大小就可以尽快完成。这消除了第二次复制/重新调整大小的需要。

于 2013-05-30T00:07:20.440 回答
1

我懂了。如果您正在处理非常大的图像。你其实是

  1. 将元文件转换为大位图
  2. 调整位图大小

我建议您只需一步将其转换为较小的位图。

pageImage = new Bitmap(imge.Width * 0.35f, imge.Height * 0.35f);

并删除调整大小代码

//pageImage = ResizeBitmap(pageImage, .35f, InterpolationMode.HighQualityBicubic);

如果这不能解决您的问题,则意味着您的图元文件太复杂而无法渲染。在这种情况下,缓慢DrawImage是不可避免的。您可以考虑一些推测技术(在需要之前猜测并渲染图像)来覆盖此功能的延迟。

于 2013-05-29T23:52:19.373 回答