青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 67  文章 - 171  trackbacks - 0
<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

常用鏈接

留言簿(10)

隨筆分類

隨筆檔案

連接資料

最新隨筆

搜索

  •  

最新隨筆

最新評論

// Dib.h: interface for the CDib class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_)
#define AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CDib : public CObject 
{
public:
 CDib();
 virtual ~CDib();
//operations
public:
 // 用于操作DIB的函數聲明
 BOOL   ConstructPalette(HGLOBAL,CPalette* );         //構造邏輯調色板
 LPSTR  GetBits(LPSTR);                               //取得位圖數據的入口地址
 DWORD  GetWidth(LPSTR);                              //取得位圖的寬度
 DWORD  GetHeight(LPSTR);                             //取得位圖的高度
 WORD   GetPalSize(LPSTR);                            //取得調色板的大小
 WORD   GetColorNum(LPSTR);                            //取得位圖包含的顏色數目
 WORD   GetBitCount(LPSTR);                            //取得位圖的顏色深度
 HGLOBAL   LoadFile(CFile&);                          //從文件中加載位圖
 BOOL SaveFile(HGLOBAL hDib, CFile& file);


// 在對圖象進行處理時,針對位圖的字節寬度必須是4的倍數的這一要求,
// 我們設計了函數GetRequireWidth,來處理這種比較特殊的情況
 int     GetReqByteWidth(int );                     //轉換后的字節數GetRequireByteWidth
 long    GetRectWidth(LPCRECT );                    //取得區域的寬度
 long    GetRectHeight(LPCRECT);                    //取得區域的高度
public:
 void ClearMemory();
 void InitMembers();
public:
 LPBITMAPINFO        lpbminfo; // 指向BITMAPINFO結構的指針
 LPBITMAPINFOHEADER  lpbmihrd; //指向BITMAPINFOHEADER結構的指針
 BITMAPFILEHEADER bmfHeader;  //BITMAPFILEHEADER結構
 LPSTR    lpdib;      //指向DIB的指針
 LPSTR    lpDIBBits;  // DIB像素指針
 DWORD    dwDIBSize;  //DIB大小
 
 HGLOBAL    m_hDib;//DIB對象的句柄
 CPalette* m_palDIB;//調色板指針
};

#endif // !defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_)

/////////////////////////////////////////////////////////////////////實現文件//////////////////////////////////////////////////////////////////////////////
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Dib.h"

#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDib::CDib()
{
 InitMembers();
}

CDib::~CDib()
{
 ClearMemory();
}

/*************************************************************************
 * 函數名稱:ConstructPalette(HGLOBAL hDIB, CPalette* pPal)
 * 函數參數:
 *   HGLOBAL hDIB,DIB對象的句柄
 *   CPalette* pPal,調色板的指針
 * 函數類型:BOOL
 * 函數說明:該函數按照DIB創建一個邏輯調色板 
 ************************************************************************/

BOOL CDib::ConstructPalette(HGLOBAL hDIB, CPalette* pPal)

 
 HANDLE hLogPal;// 邏輯調色板的句柄 
 int iLoop;// 循環變量 
 BOOL bSuccess = FALSE;// 創建結果 
 if (hDIB == NULL)//判斷是否是有效的DIB對象
 {  
  return FALSE;// 返回FALSE
 } 
 lpdib = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);// 鎖定DIB
 lpbminfo= (LPBITMAPINFO)lpdib;   
 long wNumColors =GetColorNum(lpdib);// 獲取DIB中顏色表中的顏色數目 
 if (wNumColors != 0)
 {  
  hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)// 分配為邏輯調色板內存
         + sizeof(PALETTEENTRY)
         * wNumColors); 
  if (hLogPal == 0)// 如果失敗則退出
  {   
   ::GlobalUnlock((HGLOBAL) hDIB);// 解除鎖定   
   return FALSE;
  }  
  LPLOGPALETTE lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);  
  
  lpPal->palVersion = 0x300;// 設置調色板版本號    
  lpPal->palNumEntries = (WORD)wNumColors;// 設置顏色數目  
  for (iLoop=0; iLoop<(int)wNumColors;iLoop++)// 讀取調色板
  {   
   lpPal->palPalEntry[iLoop].peRed =lpbminfo->bmiColors[iLoop].rgbRed;// 讀取三原色分量      
   lpPal->palPalEntry[iLoop].peGreen =lpbminfo->bmiColors[iLoop].rgbGreen;       
   lpPal->palPalEntry[iLoop].peBlue =lpbminfo->bmiColors[iLoop].rgbBlue;        
   lpPal->palPalEntry[iLoop].peFlags =0;// 保留位   
  }  
  bSuccess=pPal->CreatePalette(lpPal);// 按照邏輯調色板創建調色板,并返回指針   
  ::GlobalUnlock((HGLOBAL) hLogPal);// 解除鎖定    
  ::GlobalFree((HGLOBAL) hLogPal);// 釋放邏輯調色板
 }  
 ::GlobalUnlock((HGLOBAL) hDIB);// 解除鎖定  
 return bSuccess;// 返回結果
}

/*************************************************************************
 * 函數名稱:GetBits(LPSTR lpdib)
 * 函數參數:
 *   LPSTR lpdib,指向DIB對象的指針
 * 函數類型:LPSTR
 * 函數功能:計算DIB像素的起始位置,并返回指向它的指針
 ************************************************************************/

LPSTR CDib::GetBits(LPSTR lpdib)
{
 return (lpdib + ((LPBITMAPINFOHEADER)lpdib)->biSize+GetPalSize(lpdib));
// return (lpdib + *(LPDWORD)lpdib+GetPalSize(lpdib));
}

/*************************************************************************
 * 函數名稱:GetWidth(LPSTR lpdib)
 * 函數參數:
 *   LPSTR lpdib,指向DIB對象的指針
 * 函數類型:DWORD
 * 函數功能:該函數返回DIB中圖象的寬度
 ************************************************************************/

DWORD CDib::GetWidth(LPSTR lpdib)
{
 return ((LPBITMAPINFOHEADER)lpdib)->biWidth;//返回DIB寬度
}


/*************************************************************************
 * 函數名稱:GetHeight(LPSTR lpdib)
 * 函數參數:
 *   LPSTR lpdib ,指向DIB對象的指針
 * 函數類型:DWORD
 * 函數功能:該函數返回DIB中圖象的高度
 ************************************************************************/


DWORD CDib::GetHeight(LPSTR lpdib)
{
 return ((LPBITMAPINFOHEADER)lpdib)->biHeight;//返回DIB高度

}
/*************************************************************************
 * 函數名稱:GetPalSize(LPSTR lpdib)
 * 函數參數:
 *   LPSTR lpdib,指向DIB對象的指針
 * 函數類型:WORD
 * 函數功能:該函數返回DIB中調色板的大小
 ************************************************************************/

WORD CDib::GetPalSize(LPSTR lpdib)

 return (WORD)(GetColorNum(lpdib) * sizeof(RGBQUAD));// 計算DIB中調色板的大小
}

/*************************************************************************
 * 函數名稱:GetColorNum(LPSTR lpdib)
 * 函數參數:
 *   LPSTR lpdib,指向DIB對象的指針
 * 函數類型:WORD
 * 函數功能:該函數返回DIB中調色板的顏色的種數
 ************************************************************************/
WORD CDib::GetColorNum(LPSTR lpdib)

 long dwClrUsed = ((LPBITMAPINFOHEADER)lpdib)->biClrUsed; // 讀取dwClrUsed值 
 
 if (dwClrUsed != 0)
 {   
  return (WORD)dwClrUsed;// 如果dwClrUsed不為0,直接返回該值
 }
 else
 {
  dwClrUsed=(long)pow(2,24);
  return (WORD)dwClrUsed;
 }
}

/*************************************************************************
 * 函數名稱:GetBitCount(LPSTR lpdib)
 * 函數參數:
 *   LPSTR lpdib,指向DIB對象的指針
 * 函數類型:WORD
 * 函數功能:該函數返回DIBBitCount
 ************************************************************************/
WORD CDib::GetBitCount(LPSTR lpdib)
{
 return ((LPBITMAPINFOHEADER)lpdib)->biBitCount;// 返回位寬
}


/*************************************************************************
 * 函數名稱:LoadFile(CFile& file)
 * 函數參數:
 *   CFile& file,要讀取得文件文件CFile
 * 函數類型:HGLOBAL
 * 函數功能:將指定的文件中的DIB對象讀到指定的內存區域中
 *************************************************************************/

HGLOBAL CDib::LoadFile(CFile& file)
{

 DWORD dwFileSize;
 
 dwFileSize= file.GetLength();//獲取文件大小 
 if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))// 讀取DIB文件頭
 {  
  return NULL;// 大小不一致,返回NULL
 }
 // 如果文件類型不是"BM",其16進制值為0x4d42,則返回并進行相應錯誤處理
 if (bmfHeader.bfType !=0x4d42)
 {  
  return NULL;// 如果不是則返回NULL
 } 
 m_hDib= (HGLOBAL) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwFileSize-sizeof(BITMAPFILEHEADER));// 分配DIB內存
 if (m_hDib==NULL)
 {  
  return NULL;// 分配失敗,返回NULL
 }
 /////////////////////////////////////////////////////////////////////////
 //給CDib類的成員變量賦值 
 lpdib = (LPSTR) ::GlobalLock((HGLOBAL) m_hDib);// 鎖定 
 if (file.ReadHuge(lpdib, dwFileSize - sizeof(BITMAPFILEHEADER)) !=// 讀像素
  dwFileSize - sizeof(BITMAPFILEHEADER) )//大小不一致
 {     
  ::GlobalUnlock((HGLOBAL) m_hDib); // 解除鎖定   
  ::GlobalFree((HGLOBAL) m_hDib); // 釋放內存
  return NULL;
 }  
 ::GlobalUnlock((HGLOBAL) m_hDib);// 解除鎖定  
 return m_hDib;// 返回DIB句柄
}

/*************************************************************************
 * 函數名稱:GetReqByteWidth(int bits)
 * 函數參數:
 *   int bits,位數
 * 函數類型:int
 * 函數功能:獲取需要的行字節數,應為4的倍數
 *************************************************************************/
int  CDib::GetReqByteWidth(int bits)
{
 int getBytes=(bits + 31) / 32 * 4;
 return  getBytes;
}

/*************************************************************************
 * 函數名稱:GetRectWidth(LPCRECT lpRect)
 * 函數參數:
 *   LPCRECT lpRect,指向矩形區域的指針
 * 函數類型:long
 * 函數功能:獲取矩形區域的寬度
 *************************************************************************/

long  CDib::GetRectWidth(LPCRECT lpRect)
{
 long nWidth=lpRect->right - lpRect->left;
 return nWidth;
}
/*************************************************************************
 * 函數名稱:GetRectHeight(LPCRECT lpRect)
 * 函數參數:
 *   LPCRECT lpRect,指向矩形區域的指針
 * 函數類型:long
 * 函數功能:獲取矩形區域的高度
 *************************************************************************/
long  CDib::GetRectHeight(LPCRECT lpRect)
{
 long nHeight=lpRect->bottom - lpRect->top;
 return nHeight;
}

/*************************************************************************
 * 函數名稱:InitMembers()
 * 函數類型: void
 * 函數功能:初始化類的成員變量
 *************************************************************************/
void CDib::InitMembers()
{
 m_hDib=NULL;
 lpdib=NULL;
 lpDIBBits=NULL;
}

/*************************************************************************
 * 函數名稱:ClearMemory()
 * 函數類型: void
 * 函數功能:復位類的成員變量
 *************************************************************************/
void CDib::ClearMemory()
{
 if(m_hDib!=NULL)
  ::GlobalFree(m_hDib);
 lpdib=NULL;
}

/*************************************************************************
 * 函數名稱:SaveFile(HGLOBAL hDib, CFile& file)
 * 函數參數:
 *   HGLOBAL hDib,要保存的DIB
 *   CFile& file,保存文件CFile
 * 函數類型:BOOL
 * 函數功能:將指定的DIB對象保存到指定的CFile中
 *************************************************************************/

BOOL CDib::SaveFile(HGLOBAL hDib, CFile& file)
{
 if (hDib == NULL)
 {  
  return FALSE;// 如果DIB為空,返回FALSE
 } 
 lpbmihrd = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);// 讀取BITMAPINFO結構,并鎖定 
 if (lpbmihrd == NULL)
 {  
  return FALSE;// 為空,返回FALSE
 }  
 bmfHeader.bfType ='BM'; // 填充文件頭 
 dwDIBSize = *(LPDWORD)lpbmihrd + GetPalSize((LPSTR)lpbmihrd);// 文件頭大?。伾泶笮?nbsp;  
 DWORD dwBmBitsSize;// 像素的大小  
 dwBmBitsSize =GetReqByteWidth((lpbmihrd->biWidth)*((DWORD)lpbmihrd->biBitCount)) * lpbmihrd->biHeight;// 大小為Width * Height  
 dwDIBSize += dwBmBitsSize;// 計算后DIB每行字節數為4的倍數時的大小
 lpbmihrd->biSizeImage = dwBmBitsSize;// 更新biSizeImage 
 bmfHeader.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);// 文件大小  
 bmfHeader.bfReserved1 = 0;// 兩個保留字
 bmfHeader.bfReserved2 = 0;
 bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpbmihrd->biSize// 計算偏移量bfOffBits
       + GetPalSize((LPSTR)lpbmihrd);
 file.Write(&bmfHeader, sizeof(BITMAPFILEHEADER));// 寫文件頭    
 file.WriteHuge(lpbmihrd, dwDIBSize);// 寫DIB頭和像素
 
 ::GlobalUnlock((HGLOBAL) hDib);// 解除鎖定 
 return TRUE;// 返回TRUE
}

posted on 2008-02-03 18:26 cpsprogramer 閱讀(13636) 評論(8)  編輯 收藏 引用

FeedBack:
# re: CDib類 2008-02-18 09:44 wangjs
為什么要用GlobalAlloc,而不用其它的內存管理函數?  回復  更多評論
  
# re: CDib類 2008-03-12 21:45 foxtial
我寫了一個不用GlobalAlloc函數的 直接純c++編寫的。等做好后發表出來。不過這種庫網上太多太爛。而且有很多開源項目,比如EsayBMP就已經比較好了@wangjs
  回復  更多評論
  
# re: CDib類 2008-03-30 09:53 zhangpei
我從網上下了一個CDib類卻不知道該怎么用,樓主有能說一下你的QQ嗎?我們交流一下啊,  回復  更多評論
  
# re: CDib類[未登錄] 2008-04-10 01:00 panda
這個類讀不了OS2版本的位圖,稍稍改一下可能更好。  回復  更多評論
  
# re: CDib類 2009-03-20 17:13 =lfei=
這個CDib類怎么從資源里裝載一個BMP位圖并顯示呀、給一下代碼好嗎?
提示: error C2664: “CDib::LoadFile” : 不能將參數 1 從“CDC *__w64 ”轉換為“CFile &”
  回復  更多評論
  
# re: CDib類 2009-03-24 11:22 愛愛愛
@=lfei=
給我你的郵箱~  回復  更多評論
  
# re: CDib類 2009-06-18 07:03 =lfei=
@=lfei=
@愛愛愛
我的郵箱:
lfeinv@sina.com
謝謝你!@_@  回復  更多評論
  
# re: CDib類[未登錄] 2009-08-29 12:44 amu
請問怎么用VC++實現數據成像,例如這樣的一組數
1 ,2, 3, 4, 5
2 ,5, 3, 6, 9
7 ,5, 2, 9, 4
6, 7, 3, 2, 5
4, 8, 6, 2, 1
顯示為灰度圖。這個CDIB類能實現嗎?能不能給點代碼?謝謝!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              欧美一区二区三区在线免费观看| 乱码第一页成人| 久久精品成人一区二区三区蜜臀| 亚洲欧美日韩天堂| 亚洲在线一区二区三区| 亚洲三级视频在线观看| 亚洲看片一区| 99xxxx成人网| 9色精品在线| 午夜精品久久久久久久久久久久 | 巨乳诱惑日韩免费av| 久久久久久97三级| 欧美不卡高清| 亚洲精品一区久久久久久 | 欧美在线视频免费| 久久另类ts人妖一区二区| 欧美不卡高清| 欧美四级剧情无删版影片| 国产日韩欧美日韩| 亚洲精品韩国| 亚洲欧美精品一区| 美女尤物久久精品| 999亚洲国产精| 欧美专区日韩专区| 欧美日韩国产一区精品一区| 国产精品裸体一区二区三区| 狠狠色丁香久久婷婷综合_中| 亚洲国产精品传媒在线观看| 一区二区精品| 欧美3dxxxxhd| 亚洲欧美日韩中文视频| 欧美国产一区在线| 亚洲免费精彩视频| 欧美一区亚洲一区| 欧美视频成人| 日韩天堂在线观看| 久久青青草综合| 一区二区三区日韩精品视频| 裸体歌舞表演一区二区| 国产欧美一区在线| 亚洲一卡二卡三卡四卡五卡| 欧美福利视频在线| 久久国产99| 国产精品久久久久久久久久免费看| 激情欧美一区二区| 欧美在线免费观看| 一区二区三区久久久| 欧美精品免费在线观看| 在线观看国产精品网站| 久久久亚洲精品一区二区三区| 亚洲日本电影在线| 亚洲专区在线视频| 欧美色综合天天久久综合精品| 亚洲成人中文| 久久漫画官网| 欧美一级午夜免费电影| 国产精品视频999| 亚洲永久在线观看| 亚洲午夜精品一区二区三区他趣| 欧美激情一级片一区二区| 亚洲欧洲日韩在线| 亚洲国产精品第一区二区三区| 久久久久久久999精品视频| 国产婷婷色一区二区三区在线 | 中文在线资源观看网站视频免费不卡 | 亚洲免费观看高清在线观看| 欧美大片免费看| 欧美a级在线| 亚洲美女在线观看| 一区二区三区四区精品| 国产精品久久午夜| 久久99伊人| 久久国产福利国产秒拍| 国产综合色精品一区二区三区| 久久免费视频网| 久久野战av| av成人国产| 亚洲一区二区三区四区中文| 国产欧美精品一区aⅴ影院| 久久国产天堂福利天堂| 久久精品国产欧美亚洲人人爽| 国内精品久久久久国产盗摄免费观看完整版| 亚洲欧美影音先锋| 久久久久久91香蕉国产| 亚洲国产成人不卡| 一区二区高清视频| 黑人巨大精品欧美一区二区| 亚洲国产精品国自产拍av秋霞| 欧美激情第三页| 欧美午夜一区二区| 久久一区中文字幕| 欧美超级免费视 在线| 中文精品在线| 欧美一区二区三区在线观看| 亚洲人成欧美中文字幕| 亚洲欧美国产高清| 亚洲精品一区在线| 亚洲专区在线| 日韩亚洲精品电影| 欧美影院午夜播放| 正在播放欧美视频| 欧美一区午夜精品| 亚洲视频免费观看| 久久影院亚洲| 午夜亚洲视频| 欧美国产激情| 久久夜精品va视频免费观看| 欧美日韩亚洲视频一区| 麻豆国产va免费精品高清在线| 欧美日韩视频一区二区| 欧美二区在线看| 国产区精品在线观看| 亚洲精品永久免费| 亚洲福利小视频| 欧美怡红院视频一区二区三区| 一区二区三区高清在线观看| 久久国产精品久久国产精品 | 欧美欧美在线| 免播放器亚洲一区| 国产欧美一区二区三区久久人妖| 亚洲激情啪啪| 亚洲国产精品精华液2区45| 欧美一区二区三区四区夜夜大片 | 久久精品女人| 国产精品萝li| 亚洲午夜国产成人av电影男同| 最新69国产成人精品视频免费| 欧美在线视频观看| 久久人人爽人人爽| 国产日韩亚洲欧美精品| 亚洲视频中文| 午夜精品久久久久| 国产精品久久久久久久一区探花 | 欧美电影资源| 麻豆成人综合网| 黄色欧美成人| 久久九九精品99国产精品| 久久精品国产亚洲aⅴ| 欧美视频不卡中文| 中文精品视频| 亚洲欧美怡红院| 国产精品久久久久久久午夜片| 亚洲一二三区视频在线观看| 亚洲欧美日韩天堂一区二区| 欧美日韩国产欧| 午夜精品在线| 一区二区三区黄色| 亚洲免费在线看| 国产伦精品一区二区三区照片91| 在线视频欧美日韩| 午夜视频久久久| 国产视频综合在线| 久久蜜臀精品av| 亚洲国产精品www| 宅男噜噜噜66一区二区66| 欧美日韩一区在线| 亚洲一区欧美| 欧美中文字幕在线| 一区在线播放视频| 欧美精品91| 亚洲欧美999| 免费成人激情视频| 日韩一级视频免费观看在线| 欧美性猛交xxxx免费看久久久| 午夜精品影院| 亚洲国产日韩欧美| 欧美一级在线视频| 加勒比av一区二区| 欧美日韩在线视频首页| 欧美中文字幕在线| 亚洲人成在线免费观看| 久久国产精品99国产| 亚洲激情电影中文字幕| 欧美性jizz18性欧美| 欧美伊人久久大香线蕉综合69| 亚洲国产高清一区| 久久er精品视频| 亚洲精选大片| 国产一区二区久久久| 欧美精品尤物在线| 欧美一区二区在线免费播放| 亚洲国产精品ⅴa在线观看| 午夜在线一区二区| 亚洲精品国产精品国自产观看浪潮| 欧美午夜一区二区福利视频| 久久在线免费观看| 亚洲一区二区三区免费观看| 模特精品在线| 欧美在线视频播放| 一区二区三区国产精华| 一区二区三区在线视频免费观看 | 欧美日韩中文在线| 麻豆精品视频在线观看视频| 亚洲一二三区在线| 日韩天堂在线观看| 亚洲国产综合在线看不卡| 久久久久久一区| 羞羞答答国产精品www一本| 亚洲最新视频在线| 亚洲精品乱码久久久久久日本蜜臀 |