更快的图形DrawImage

时间:2013-05-29 13:26:19

标签: c# graphics drawimage

我已经运行了这个代码,它运行的是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;
        }
    }

3 个答案:

答案 0 :(得分:1)

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

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

难道不是你的Metafile里面有很多抽奖操作吗?所以也许这是一个更好的解决方案,只需在您的客户端即时创建图像,然后只是发送图像?

[edit]或者不要使用Graphics类并创建自己的?[/ edit]

答案 1 :(得分:1)

哦,我明白了。如果您正在处理非常大的图像。你实际上是

  1. 将图元文件转换为大位图
  2. 调整位图大小
  3. 我建议您只需一步将其转换为较小的位图。

    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矩阵和位置偏移。通过将矩阵的左上角和右下角元素设置为缩放,您可以创建缩放变换。这样,重新调整大小尽快完成。这消除了对第二次复制/重新调整大小的需要。