`
emowuyi
  • 浏览: 1475233 次
文章分类
社区版块
存档分类
最新评论

使用GDI+位图数据扫描线处理图像的小技巧

 
阅读更多

在GDI+图像处理中,我们经常利用BitmapData结构对图像数据扫描线进行操作,在我的大部分BOLG文章中,都使用了这个方法。GDI+位图通过其LockBits方法和UnlockBits方法,分别用来锁定(获取)和解锁(释放)BitmapData数据,我们一般都在这2个方法之间操作图像数据扫描线,如:

由于在LockBits方法和UnlockBits方法之间,位图对象是锁定的,很多方法无法调用,有时也感到有些不方便,甚至繁琐。比如对图像数据扫描线进行多次处理,在处理过程中想分步骤显示或者保存时,就不得不反复调用这2个方法;还有就是位图格式低于24位格式的图像无法锁定为24位或32位数据进行操作(我们大多利用24位或者32位像素扫描线进行图像处理)等等。

可以使用一些小技巧来规避因位图对象锁定而带来的不方便,也可对低于24位格式的图像进行24位或32位图像数据扫描线操作。请看下面的例子:

上面例子代码中作了较详细的说明,就不再解释。

上面的例子为了解释位图对象共享和数据处理同步,代码显得有些凌乱,其实只要记住一点:例子中,自定义位图对象bmp2通过bmp->LockBits方法取得数据后,如果无特殊需要,bmp就可解锁甚至delete,这时也不再需要对bmp2锁定,就可通过对data的处理,达到对bmp2包含的图像数据进行改变的目的。

将上面代码重新规划一下,使之清晰一些:

通过上面代码,就可以看出调用GetBitmapData后,所有的图像数据信息就已经包含在BitmapData结构中了,所以我们可以对这个数据结构进行任何的操作,而不再依赖任何GDI+对象,由此避免了本文前面所说的不方便。之所以又建立一个自定义数据位图对象,只是要借助它进行图像显示、保存等操作而已。

利用类似于前面的例子代码还可以进行拼图操作:

本文代码采用BCB编译器。如有错误,可来信指正,并请提出建议:maozefa@hotmail.com

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics