惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
I
InfoQ
雷峰网
雷峰网
Hugging Face - Blog
Hugging Face - Blog
IT之家
IT之家
云风的 BLOG
云风的 BLOG
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
The GitHub Blog
The GitHub Blog
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
G
Google Developers Blog
WordPress大学
WordPress大学
B
Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
Apple Machine Learning Research
Apple Machine Learning Research
N
Netflix TechBlog - Medium
Last Week in AI
Last Week in AI
博客园 - 聂微东
Jina AI
Jina AI

博客园 - sunwaywei

被MM当成电脑白痴了 用Delphi编写的一个上网助手 Excel 2007的日期格式设置 使用UpdatePanel控件要注意的一个问题 Chuck Jazdzewski 对新手程序员的建议 打赢了一场效率仗 一个极有可能引发ExecutionEngineException的情况 竟然是灰鸽子? They're Back!!! Turbo系列产品的回归! 不小心染上了Bloodhound.NsAnti .net 2.0 的 Bug?--与 COM 交互时发生奇怪的 InvalidCastException 第三届虚拟现实峰会 忙碌的这几天 ASP.NET 2.0 中使用自定义缓存依赖 在 .net 2.0 中使用自定义事务操作 郁闷的端午节 奇怪的C++问题 为了一个 const 折腾了半天 CAD二次开发中遇到一个无法解决的问题
使用C++绘制算法弥补.net图形绘制缺陷
sunwaywei · 2006-12-27 · via 博客园 - sunwaywei

在.net framework中,绘制图形一般是使用Graphics.DrawImage方法,但是这个方法在许多时候有明显的缺陷。

以上是一张图的两种显示效果。左侧为windows自身的缩略图显示效果,右侧为调用DrawImage方法所显示的效果。源图为tiff格式,幅面大小为3185*2276,300*300dpi,图形文件大小52.4KB。可以看到两种显示效果有明显的区别,这是由于DrawImage在处理图形的高比例缩小时采用了默认算法,导致了图形显示的严重失真。

更为严重的缺陷是,DrawImage函数对于更大幅面的图像绘制几乎完全不能胜任,测试中使用了一个幅面为13290*9600,400*400dpi,大小为2.5MB的一个tiff文件,DrawImage函数一运行一下子就使得我的本本虚拟内存全部耗完,整个系统陷入没有响应的状态!

基于以上原因,在绘制大型图像时,已不能再使用.net framework提供的DrawImage方法。在最近我做的一个程序中,便重新开发了一个C++的动态链接库来完成大型图像的绘制,显示的效果和速度均得到极佳的体现!

C++绘制函数原型:

1extern "C" void HighSpeedDraw(HDC hDC, int srcLeft, int srcTop, int srcRight, int srcBottom,
2    int dstLeft, int dstTop, int dstRight, int dstBottom)
3{
4    CDC* pDC = CDC::FromHandle(hDC);
5    CRect srcRect(srcLeft, srcTop, srcRight, srcBottom);
6    CRect dstRect(dstLeft, dstTop, dstRight, dstBottom);
7    pDrawEngine->Draw(pDC, dstRect, srcRect);
8}

在C#中的包装:

1[DllImport("HSDraw.dll")]
2private extern static void HighSpeedDraw(IntPtr hDC, int srcLeft, int srcTop, int srcRight, int srcBottom,
3    int dstLeft, int dstTop, int dstRight, int dstBottom)

OK,在Paint函数中就可以这样调用了:

 1try
 2{
 3  checked
 4  {
 5    IntPtr hDC = e.Graphics.GetHdc();
 6    HighSpeedDraw(hDC, sourceRect.Left, sourceRect.Top, sourceRect.Right, sourceRect.Bottom,
 7        targetRect.Left, targetRect.Top, targetRect.Right, targetRect.Bottom);
 8    e.Graphics.ReleaseHdc(hDC);
 9  }

10}

11catch (Exception ex)
12{
13  graphics.DrawString(ex.ToString(), new Font("Arial"8), Brushes.Red, new PointF(00));
14}

以下是使用C++绘制算法看到的效果:

可以看到,新的算法绘制的效果非常好。此外,原先使用DrawImage导致系统无法响应的tiff文件,现在绘制所耗时间在1秒以内,图像绘制所消耗的内存也降至20M以下,效果得到了明显的提高。