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

隨筆 - 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>
              精久久久久久| 亚洲美女视频| 亚洲清纯自拍| 1769国内精品视频在线播放| 国产精品久久| 欧美性猛交xxxx乱大交蜜桃| 欧美精品一区二区三区视频| 最新日韩在线| 激情综合色丁香一区二区| 国产性天天综合网| 尤物视频一区二区| 亚洲免费观看在线视频| 亚洲欧洲一区二区天堂久久| 亚洲毛片在线观看.| 午夜精品福利视频| 久久成年人视频| 欧美黄色影院| 一区二区三区不卡视频在线观看| 一区二区三区四区在线| 欧美中文字幕精品| 欧美国产三区| 国产精一区二区三区| 亚洲国产精品ⅴa在线观看 | 快播亚洲色图| 91久久国产精品91久久性色| 欧美激情小视频| 性欧美videos另类喷潮| 欧美激情中文字幕乱码免费| 国产三级欧美三级| 亚洲人体影院| 老司机久久99久久精品播放免费| 最新中文字幕亚洲| 久久精品二区亚洲w码| 国产欧美一区二区精品性 | 精品成人免费| 午夜国产精品视频| 亚洲人成网站在线观看播放| 性欧美激情精品| 一区二区三区导航| 欧美国产精品v| 在线看成人片| 欧美二区在线观看| 女同性一区二区三区人了人一| 国产欧美日韩另类一区| 亚洲欧美国产视频| 亚洲一区二区三区久久| 欧美日韩在线播放三区四区| 亚洲美女啪啪| 亚洲特黄一级片| 国产亚洲网站| 亚洲国产国产亚洲一二三| 老司机精品福利视频| 亚洲人成毛片在线播放| 欧美18av| 久久天天躁夜夜躁狠狠躁2022| 亚洲成人在线视频播放| 欧美成人自拍| 亚洲午夜精品久久| 男女精品网站| 模特精品在线| 国产自产精品| 久久久久免费视频| 久久综合伊人77777| 欧美成人免费大片| 性欧美超级视频| 免费h精品视频在线播放| 欧美日韩成人在线视频| 国产毛片一区| 亚洲精品视频免费| 久久人人97超碰国产公开结果| 在线亚洲伦理| 亚洲欧洲一区二区三区久久| 免费黄网站欧美| 国产麻豆视频精品| 久久天天躁狠狠躁夜夜av| 欧美三级日本三级少妇99| 美女任你摸久久| 国产精品夜夜夜| 亚洲精品日韩精品| 亚洲日产国产精品| 蜜臀久久久99精品久久久久久| 久久国产精品久久久久久久久久| 欧美三级在线| 国内精品久久久久影院色| 狠狠久久综合婷婷不卡| 亚洲国产欧美另类丝袜| 午夜精品久久久久久久久久久久 | 蜜桃av噜噜一区| 亚洲欧美精品伊人久久| 欧美精品自拍| 亚洲永久在线观看| 久久久久**毛片大全| **网站欧美大片在线观看| 浪潮色综合久久天堂| 亚洲巨乳在线| 欧美专区在线观看一区| 国产亚洲欧美另类中文| 欧美mv日韩mv国产网站app| 日韩视频一区二区三区在线播放| 亚洲一区在线看| 久热精品视频在线免费观看| 黄色精品一区| 欧美日韩国产综合视频在线观看中文| 一区二区三区免费网站| 久久久av网站| 欧美精品久久天天躁| 亚洲一区中文字幕在线观看| 免费影视亚洲| 欧美在线中文字幕| 99精品欧美一区| 亚洲全黄一级网站| 在线观看不卡| 韩国av一区二区三区在线观看| 欧美日韩美女一区二区| 欧美国产日本在线| 久久综合色婷婷| 久久色在线观看| 欧美亚洲一区| 欧美一级成年大片在线观看| 一本色道久久综合亚洲精品婷婷| 你懂的视频欧美| 可以看av的网站久久看| 久久伊人免费视频| 老**午夜毛片一区二区三区| 欧美一区二区大片| 久久米奇亚洲| 欧美风情在线| 夜夜狂射影院欧美极品| 日韩视频免费观看高清完整版| 一区二区日韩免费看| 欧美一区二区三区精品| 久久精品视频网| 欧美国产综合一区二区| 欧美视频在线观看 亚洲欧| 国产精品美腿一区在线看| 国产精品一区二区三区免费观看| 国产精品一区二区欧美| 亚洲激情一区二区| 先锋资源久久| 亚洲第一视频网站| 一区二区欧美国产| 久久乐国产精品| 国产精品一区在线观看你懂的| 在线精品国精品国产尤物884a| 一区二区三区色| 亚洲国产第一页| 久久人人九九| 亚洲小说欧美另类社区| 欧美成人免费播放| 在线视频成人| 老色鬼久久亚洲一区二区| 亚洲综合不卡| 国产精品伦理| 午夜精品亚洲| 亚洲免费一在线| 国产精品成人一区二区三区吃奶 | 一区二区三区在线视频播放 | 日韩一级黄色大片| 亚洲国产精品女人久久久| 久久噜噜噜精品国产亚洲综合| 国产一区二区高清视频| 欧美在线视频在线播放完整版免费观看| 欧美高清在线观看| 欧美精品在线免费播放| a4yy欧美一区二区三区| 日韩亚洲在线观看| 国产精品久久久91| 久久国产精品久久久久久电车| 久久本道综合色狠狠五月| 亚洲国产成人精品久久久国产成人一区| 久久国内精品自在自线400部| 欧美亚洲色图校园春色| 依依成人综合视频| 一区二区电影免费观看| 国产一区免费视频| 亚洲国产精品成人一区二区| 欧美视频官网| 亚洲第一狼人社区| 黄色成人在线| 亚洲在线视频免费观看| 亚洲人成网站影音先锋播放| 在线亚洲精品福利网址导航| 在线播放国产一区中文字幕剧情欧美| 亚洲激情女人| 一区二区三区在线观看欧美| 99热在这里有精品免费| 欧美在线看片a免费观看| 亚洲精品字幕| 亚洲日本理论电影| 精久久久久久| 久久精品视频免费| 亚洲精品乱码久久久久久黑人 | 欧美成人高清| 一个色综合导航| 亚洲电影av| 国产一区二区三区成人欧美日韩在线观看 | 欧美一区二区黄色| 日韩写真视频在线观看| 韩国成人理伦片免费播放| 国产精品久久久爽爽爽麻豆色哟哟|