Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速图形绘制图像_C#_Graphics_Drawimage - Fatal编程技术网

C# 快速图形绘制图像

C# 快速图形绘制图像,c#,graphics,drawimage,C#,Graphics,Drawimage,我已经运行了这段代码,它所做的是流式传输一个RDLC文件,将其转换为图像并保存。流是在手之前创建的,并保存在内存中。 我面临的问题是这个函数非常慢。执行需要2-3秒。 执行这一行花费的时间最多 graphics.DrawImage(imge, adjustedRect); 大多数。我怎样才能使它更快请帮忙 public void PrintImagePage(int PageNo) { try { Metafi

我已经运行了这段代码,它所做的是流式传输一个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;
        }
    }

至于你的问题,不,我认为没有办法加快图形课程的速度

我以前没有使用过图元文件,所以我真的不知道什么是快的和慢的。但据我所知,它基于以前所做的绘制操作(比如在某些客户机上)重新创建了一个图像

难道不是图元文件中有很多绘制操作吗?所以,也许这是一个更好的解决方案,只需在客户机上动态创建图像,然后发送图像


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

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

  • 将图元文件转换为大型位图
  • 调整位图的大小
  • 我建议您只需一步将其转换为较小的位图

    pageImage=新位图(imge.Width*0.35f,imge.Height*0.35f)

    并删除调整大小代码

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


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

    < P>你可以使用图形内置的变换和再采样特征把它画成更小的RcT.

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

    我记得该功能只是快速启动。你正在处理非常大的图像吗?是的,原始图像非常大。这就是为什么我在存钱之前调整它的大小只是不调整大小。首先,将其创建为正确的大小,并在DrawImage()上保存循环。获取匹配的像素格式非常重要。如果你想让它更快,那么你需要满足于更小的插值模式。我正试图用大格式多页Tiff文件(600dpi扫描,3000px+x250px+每帧)来克服这个速度问题。你有没有发现有效的优化?这个线程帮助我减少了30%的绘图时间,但我仍然需要更高的性能。imge=new Metafile(m_streams[PageNo]);有一个由reporting tool创建的流,然后放在一个新的元文件上——可能先将该流下载到memorystream中,然后基于该memorystream创建图像?可能I/O要花很多时间。(这里只是猜测;)