这段时间开始研究图像处理,继续放分。我用CreateDIBSection函数创建一个设备无关位图,函数声明如下:
CreateDIBSection(ByVal hDC As Long, pBitmapInfo As BITMAPINFO, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
其中第四个参数是指向位图数据的一个指针,我试了下用CopyMemory可以取出位图数据。而且还可以向这个地址写入数据。可是我看了下网上的例子,大多数都用得GetDIBits函数来取数据。不知两者有何区别?

解决方案 »

  1.   

    DIB and DDB
    see http://support.microsoft.com/default.aspx?scid=kb;EN-US;80080
      

  2.   

    不用研究了。给你个vb下的dib 类。什么都封装好了,直接调用就ok, 不用操心具体原理。
    ps: 备注原来是英文,我给翻译了一下。可能有错。
    地址: www.summer006.ys168.com
      

  3.   

    前者是DIB(Device-independent bitmap,与设备无关的位图),后者是DDB(Device-dependent bitmap,与设备相关的位图)。    假设一个位图为16色,其像素总数为800×600。我们只需要用4个bit就可以存储这个位图的每个像素在16种颜色中所处的等级,然后调色板提供了这16种等级对应的(R,G,B)值,这样,存储这个16色位图只需要:800×600×4/8 = 240000(字节)= 0.22 M(字节)  额外的存储R,G,B表的开销(即调色板Palette,也称为颜色查找表LUT)仅仅为16×3=48字节。  存储空间被大为减少!  常见的位图有单色、16色、256色、16位及24位真彩色5种,对于前三者(即不大于256色)都可以调色板方式进行存储,而对16位及24位真彩色以调色板进行存储是不划算的,它们直接按照R,G,B分量进行存储。  在此基础上我们来分析DDB位图与DIB位图的概念以及二者的区别。  DDB依赖于具体设备,它只能存在于内存中(视频内存或系统内存),其颜色模式必须与特定的输出设备相一致,使用系统调色板。一般只能载入色彩较简单的DDB位图,对于颜色较丰富的位图,需使用DIB才能长期保存。  DIB不依赖于具体设备,可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。 DIB位图的特点是将颜色信息储存在位图文件自身的颜色表中,应用程序要根据此颜色表为DIB创建逻辑调色板。因此,在输出一幅DIB位图之前,程序应该将其逻辑调色板选入到相关的设备上下文并实现到系统调色板中。
      

  4.   

    //其中第四个参数是指向位图数据的一个指针,我试了下用CopyMemory可以取出位图数据。而且还可以向这个地址写入数据。可是我看了下网上的例子,大多数都用得GetDIBits函数来取数据。不知两者有何区别?
    用后者安全一些,也显得方便
      

  5.   

    楼上有几位大哥没明白我的意思,我知道DDB跟DIB的区别,我只用DIB.
    我主要是想知道那个指针会不会发生变动,如果不会的话用CopyMemory多方便。