zoukankan      html  css  js  c++  java
  • 设备相关位图(DDB)与设备无关位图(DIB) 的区别

    设备相关位图 DDB(Device-Dependent-Bitmap)

        DDB不具有自己的调色板信息,他的颜色模式必须与输出设备相一致。如:在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。

    设备无关位图DIB(Device-Independent-Bitmap)

        DIB具有自己的调色板信息,他可以不依赖系统的调色板。由于他不依赖于设备,所以通常用它来保存文件,如.bmp格式的文件就是DIB.

    HBITMAP与BITMAP的区别

    BITMAP 是一个结构:  
       
      typedef   struct   tagBITMAP   {     /*   bm   */  
              int           bmType;  
              int           bmWidth;  
              int           bmHeight;  
              int           bmWidthBytes;  
              BYTE         bmPlanes;  
              BYTE         bmBitsPixel;  
              LPVOID     bmBits;  
      }   BITMAP;   

    HBITMAP  是一个指向BITMAP的句柄

      HBITMAP   HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
    "aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
      BITMAP   bm;  
      GetObject(hBmp,sizeof(bm),&bm);  可以通过该函数 由HBITMAP取得BITMAP;

    如何通过BITMAP构造一个.bmp格式的文件

            LoadImage从磁盘中读取.bmp文件转换成了易于系统操作的HBITMAP文件,但很多时候又需要将BITMAP数据存储下来,如:存储,D3DXCreateTextureFromFileInMemory()需要严格的.bmp格式的数据才行;

      构建BITMAPFILEHEADER  bfileh; 并填充;构建BITMAPINFOHEADER binfoh并填充;

      将上述两者数据和BITMAP.bmBits的数据拷贝到一个缓冲区即可;

     memcpy( buffer, sizeof(BITMAPFILEHEADER), bfileh);

    memcpy( &buffer[sizeof(BITMAPFILEHEADER)], sizeof(BITMAPINFOHEADER), binfoh);

    memcpy( &buffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)],  图形数据区字节长度, bitmap.bmBits);

    其他一些DIB,DDB有用的函数:

    GetDIBits();          // 获取HBITMAP的自定数据区,要自己拿个空间去接受这些数据;

    GetBitmapBits();   // 获取HBITMAP中bitmap的指定数据区

    CreateDIBSection();  // 创建一个自定义的位图

  • 相关阅读:
    推荐系统学习--cb+cf 初见
    耳机的阻抗和灵敏度问题
    java中常见的几种Runtimeexception
    java泛型
    ubuntu安装opencv
    ubuntu12.04静态ip设置问题
    Graph Theory
    SQL简单上手教程
    C++ 构造函数、拷贝构造函数和赋值运算符重载
    C语言函数调用栈
  • 原文地址:https://www.cnblogs.com/Jade2009/p/1454263.html
Copyright © 2011-2022 走看看