大家好!   在开发过程中,发现程序若加载大图像, 确切地说是超大图像, 滚动条滚动时速度很慢很卡。 图像大小大约9000 * 6000吧! 后来我用GDI中的函数进行试验, 依旧很慢。 但是 同样的算法思路, 我用c++实现, 就没有问题。 请问大家有什么好的解决方案么? 重分奉献。

解决方案 »

  1.   

    是用什么算法来显示的?可以暂时用C++封装一个DLL来调用
      

  2.   


    同意, 既然能用c++实现并没有问题,最好做成DLL,C#可能在流程和界面上使用,核心算法C++好
      

  3.   

    这样不行 c++ 用的就是GDI呀 我用c#调用的就有问题 也是调用GDI
      

  4.   

    C# 处理图像就是垃圾!你的图还不算大,我处理的测绘的图纸,超大,十几兆,一读就报“内存不足”,建议使用专业图像处理控件,如:LeadTools,功能十分强劲。
    对了,忘了说了,C#处理图像之所以那么慢,是因为它不能管理内存,而C++则不一样,大图像只是加载慢一点,完全读到内存之后,操作起来一点都不卡。
      

  5.   


    你已经封装了DLL来调用?
    如何实现的,调用出了什么问题?
      

  6.   

     c++ 中用滚动条滚动时显示的很快吗?
    干脆把显示图像的窗体一起封装到DLL中
      

  7.   

    多谢了 我用c++用类似的方式 一点问题也没有 
    if (bmp != null)
                {                this.AutoScrollMinSize = bmp.Size;
                    hbmp = bmp.GetHbitmap();                
                    
                    IntPtr pTarget = e.Graphics.GetHdc();
                          
     
                                    
                    IntPtr pSource = CreateCompatibleDC(pTarget);
                    IntPtr pOrig = SelectObject(pSource, hbmp);
                
                                              
                                
                    StretchBlt(pTarget, this.AutoScrollPosition.X,
                           this.AutoScrollPosition.Y, bmp.Width, bmp.Height, pSource,
                          0,
                           0,bmp.Width, bmp.Height, TernaryRasterOperations.SRCCOPY);
                   IntPtr pNew = SelectObject(pSource, pOrig);
                     DeleteObject(pNew);
                    DeleteDC(pSource);
                    e.Graphics.ReleaseHdc(pTarget);
      

  8.   


    if (bmp != null)
                {
     
                    this.AutoScrollMinSize = bmp.Size;
                    hbmp = bmp.GetHbitmap();
     
                    IntPtr pTarget = e.Graphics.GetHdc();
     
                    IntPtr pSource = CreateCompatibleDC(pTarget);
                    IntPtr pOrig = SelectObject(pSource, hbmp);
                  
                    StretchBlt(pTarget, this.AutoScrollPosition.X,
                           this.AutoScrollPosition.Y, bmp.Width, bmp.Height, pSource,
                          0,
                           0,bmp.Width, bmp.Height, TernaryRasterOperations.SRCCOPY);
                   IntPtr pNew = SelectObject(pSource, pOrig);
                     DeleteObject(pNew);
                    DeleteDC(pSource);
                    e.Graphics.ReleaseHdc(pTarget);
    }
      

  9.   

    如果是32位图片,每个像素点就是BGRA4个值,按4的倍率从中间某个部分(目标显示区域矩形大小面积*4)的长度取出,然后通过指针复制到一个目标显示区域矩形大小面积的图片上.虽然大图问题可以解决,但接下来就有频率读取磁盘以及占CPU以及吃内存的问题.