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

隨筆 - 67  文章 - 171  trackbacks - 0
<2008年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(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);// 文件頭大小+顏色表大小   
 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 閱讀(13643) 評論(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類能實現嗎?能不能給點代碼?謝謝!  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              欧美日韩一区二区三区在线| aa亚洲婷婷| 99av国产精品欲麻豆| 国产午夜亚洲精品不卡| 91久久精品国产91久久性色| 国产主播精品| 亚洲综合精品| 亚洲伊人观看| 欧美日韩1区| 免费在线欧美黄色| 国产日本亚洲高清| 亚洲色无码播放| 亚洲精品护士| 欧美.www| 亚洲第一精品电影| 在线观看亚洲精品| 久久久久久电影| 久久伊人免费视频| 国产精品久久久久久久久果冻传媒| 亚洲国产美女| 亚洲欧洲在线播放| 老司机精品久久| 欧美顶级少妇做爰| 亚洲国产婷婷香蕉久久久久久| 久久精品中文| 欧美99久久| 亚洲人成网站999久久久综合| 久久在线播放| 亚洲国产小视频| 亚洲美女在线看| 欧美日韩小视频| 亚洲性视频h| 亚洲一区二区成人| 欧美极品aⅴ影院| 亚洲精品欧洲| 亚洲午夜精品网| 国产老女人精品毛片久久| 亚洲一区三区视频在线观看| 欧美一区二区日韩| 黄色国产精品| 欧美成黄导航| 一区电影在线观看| 久久福利视频导航| 在线精品视频一区二区三四| 欧美xart系列高清| 在线综合亚洲欧美在线视频| 欧美一级专区| 一区视频在线看| 欧美激情1区| 亚洲在线国产日韩欧美| 久久久噜噜噜久久狠狠50岁| 亚洲人线精品午夜| 国产精品黄视频| 久久久精品久久久久| 亚洲精品欧洲| 久久频这里精品99香蕉| av成人国产| 国产亚洲综合性久久久影院| 蜜桃伊人久久| 亚洲一区免费网站| 欧美激情在线播放| 午夜一区二区三区不卡视频| 亚洲国产婷婷香蕉久久久久久99| 国产精品chinese| 久热精品在线视频| 亚洲亚洲精品三区日韩精品在线视频| 久久视频在线免费观看| 亚洲视频1区| 亚洲电影在线| 国产裸体写真av一区二区| 欧美高清不卡在线| 久久精品久久综合| 中文日韩在线| 亚洲经典一区| 美国成人直播| 欧美一级播放| 中日韩高清电影网| 亚洲激情午夜| 好吊色欧美一区二区三区四区| 欧美视频精品在线观看| 美女黄毛**国产精品啪啪| 亚洲欧美另类久久久精品2019| 亚洲福利在线看| 美女诱惑黄网站一区| 亚洲欧洲av一区二区三区久久| 亚洲国产毛片完整版 | 亚洲欧美日韩成人| 亚洲精品久久久久久久久久久久 | 一区在线观看视频| 国产精品色网| 国产精品高清一区二区三区| 欧美伦理a级免费电影| 免费不卡欧美自拍视频| 久久久久国色av免费看影院| 欧美一级片在线播放| 亚洲图片欧美午夜| 一区二区激情视频| 一区二区日韩免费看| 亚洲美女诱惑| 亚洲精品一区二区在线| 亚洲国产日韩欧美在线动漫| 欧美成人国产一区二区| 免费看成人av| 欧美国产免费| 亚洲缚视频在线观看| 欧美激情一区二区三区成人| 亚洲电影一级黄| 亚洲国产欧美一区二区三区丁香婷| 久色成人在线| 女同一区二区| 亚洲国产精品一区| 亚洲精品少妇网址| 一本久道久久久| 亚洲视频综合| 欧美一区二区三区免费视频| 欧美在线亚洲| 久久精品日产第一区二区三区| 久久久精彩视频| 免费欧美电影| 欧美日韩精品三区| 国产精品亚洲网站| 国产亚洲aⅴaaaaaa毛片| 黄页网站一区| 亚洲欧洲一区二区在线播放 | 亚洲一区不卡| 欧美一区午夜精品| 久久中文精品| 亚洲黄页一区| 亚洲一区二区三区久久 | 久久精品国产亚洲一区二区| 老鸭窝毛片一区二区三区| 欧美激情一区三区| 国产麻豆视频精品| 在线欧美小视频| 亚洲深夜福利视频| 久久久久九九九九| 亚洲欧洲精品一区二区| 亚洲午夜在线观看视频在线| 久久精品国产第一区二区三区最新章节| 久久这里只有| 国产精品hd| 伊人久久成人| 亚洲综合精品| 欧美91视频| 亚洲女人天堂av| 欧美风情在线| 国产欧美精品国产国产专区| 91久久精品国产91久久性色| 亚洲综合色网站| 免费日韩一区二区| 在线视频亚洲一区| 久热这里只精品99re8久| 欧美三日本三级少妇三2023| 好吊妞**欧美| 欧美一级专区免费大片| 亚洲国产成人在线播放| 欧美一区二区三区的| 欧美日韩国产美| 伊人成年综合电影网| 亚洲综合不卡| 亚洲国产成人一区| 久久激情五月激情| 欧美午夜精品久久久久久浪潮| 一区二区三区在线免费视频| 亚洲欧美激情四射在线日| 免费在线观看日韩欧美| 亚洲欧美日韩国产一区二区三区| 蜜桃久久av一区| 国产一区二区三区在线观看网站| 亚洲香蕉网站| 亚洲人www| 免费在线观看一区二区| 国产欧美日韩三区| 亚洲综合日本| 亚洲精品国产精品乱码不99| 久久全国免费视频| 国产一区久久| 亚欧成人在线| 亚洲一区精品电影| 欧美日韩中文字幕精品| a91a精品视频在线观看| 亚洲高清不卡av| 免费黄网站欧美| 亚洲激情国产精品| 模特精品在线| 久热精品在线| 亚洲国产精品黑人久久久| 久久久久久久久久久一区| 小处雏高清一区二区三区| 国产欧美日韩免费| 久久riav二区三区| 欧美一区影院| 激情综合色综合久久综合| 久久久久久久综合狠狠综合| 欧美亚洲一区在线| 激情综合网激情| 亚洲成人在线视频网站| 欧美国产日本高清在线| 99视频精品在线| 一区二区三区精品视频|