`
sogotobj
  • 浏览: 671123 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用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

分享到:
评论

相关推荐

    delphi_scanline_扫描

    在计算机图形学中,"扫描线算法"(Scanline Algorithm)是一种常见的图像处理和渲染技术,主要用于二维图形的处理和三维物体的渲染。在Delphi编程环境中,这种算法可以被用来实现各种图形效果,比如标题中提到的...

    图形学(画图程序)

    常见的填充算法有扫描线算法,它按照水平线遍历图形边界,标记出内部的像素并进行填充。四边形填充和多边形填充也可以通过类似的扩展方法实现。 **保存功能**涉及到图像数据的持久化存储,通常使用位图(.bmp)或...

    易语言-PNG图片分割易语言

    2. 图像数据解析:PNG文件的图像数据是以扫描线的形式存储的,源码需要将这些数据解码成可以处理的像素数组。这可能涉及到ZLIB压缩算法的使用,因为PNG图像数据常使用ZLIB进行压缩。 3. 图片分割:此功能可能允许...

    精彩编程与编程技巧-用VB实现“百叶窗”的图形特效...

    - `scanlines` 定义了扫描线的数量,即每次显示一行的间隔行数。 - `BitBlt` 函数的参数解释如下: - `hDestDC`: 目标DC。 - `X`, `Y`: 在目标DC中的起始位置。 - `nWidth`, `nHeight`: 复制的位图宽度和高度。...

    PT80-NEAT开发指南v1.1

    移动数据终端 版本记录 版本号 版本描述 发布日期 V 1.0 初始版本。 2012-04-12 V1.1 修改前三章内容 2012-09-25 目录 第一章 关于本手册...........................................................................

Global site tag (gtag.js) - Google Analytics