winform程序 GDI+显示大图像慢 大家好! 在开发过程中,发现程序若加载大图像, 确切地说是超大图像, 滚动条滚动时速度很慢很卡。 图像大小大约9000 * 6000吧! 后来我用GDI中的函数进行试验, 依旧很慢。 但是 同样的算法思路, 我用c++实现, 就没有问题。 请问大家有什么好的解决方案么? 重分奉献。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是用什么算法来显示的?可以暂时用C++封装一个DLL来调用 同意, 既然能用c++实现并没有问题,最好做成DLL,C#可能在流程和界面上使用,核心算法C++好 这样不行 c++ 用的就是GDI呀 我用c#调用的就有问题 也是调用GDI C# 处理图像就是垃圾!你的图还不算大,我处理的测绘的图纸,超大,十几兆,一读就报“内存不足”,建议使用专业图像处理控件,如:LeadTools,功能十分强劲。对了,忘了说了,C#处理图像之所以那么慢,是因为它不能管理内存,而C++则不一样,大图像只是加载慢一点,完全读到内存之后,操作起来一点都不卡。 你已经封装了DLL来调用?如何实现的,调用出了什么问题? c++ 中用滚动条滚动时显示的很快吗?干脆把显示图像的窗体一起封装到DLL中 多谢了 我用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); 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);} 如果是32位图片,每个像素点就是BGRA4个值,按4的倍率从中间某个部分(目标显示区域矩形大小面积*4)的长度取出,然后通过指针复制到一个目标显示区域矩形大小面积的图片上.虽然大图问题可以解决,但接下来就有频率读取磁盘以及占CPU以及吃内存的问题. winfom发布问题 C# 多线程问题! 正则表达式 DataGridView 中添加 ComboBox 怎么取值 寻求 正则表达式 帮助 ---------------------- 急~在线等~~关于DataGridViewCheckBoxColumn的问题 企业库DAL写法 急问题,如何获得我新输入的文本 C#数据参数保存,总只能保存一组,不得其解!请各位支招 VC#中增么连接数据库,就是把SqlConnection 连接到dbGrid上 C# 实现程序更新的方案,大哥大姐帮一下。 repeater怎样获取id,然后传到treeview里的checkbox中?????
同意, 既然能用c++实现并没有问题,最好做成DLL,C#可能在流程和界面上使用,核心算法C++好
对了,忘了说了,C#处理图像之所以那么慢,是因为它不能管理内存,而C++则不一样,大图像只是加载慢一点,完全读到内存之后,操作起来一点都不卡。
你已经封装了DLL来调用?
如何实现的,调用出了什么问题?
干脆把显示图像的窗体一起封装到DLL中
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);
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);
}