java dib文件 加位图文件头_DIB类头文件和DIB类的实现DIB.CPP
//#ifndef __CDIB_H
#define __CDIB_H
class CDib:public CObject
{
public:
RGBQUAD* m_pRGB;//調色板指針
BYTE* m_pData;//指向實際圖像數據指針
UINT m_numberOfColors;//顏色數
BOOL m_valid;
BITMAPFILEHEADER bitmapFileHeader;//保存文件頭的內容
BITMAPINFOHEADER* m_pBitmapInfoHeader;//信息頭指
LPBITMAPINFO m_pBitmapInfo;//BITMAPINFO結構體指針指
BYTE* pDib;//分配一段size大小的內存段,返回該內存區(qū)域頭指針
DWORD size; //文件大小-文件頭結構體的大小
public:
CDib();
~CDib();
CString m_fileName;//記錄文件名
CString GetFileName();//返回位圖文件名
BOOL IsValid();
DWORD GetSize();//返回位圖文件大小
UINT GetWidth();//返回位圖的寬度
UINT GetHeight();//返回位圖的高度
UINT GetNumberOfColors();//返回位圖顏色數目
RGBQUAD* GetRGB();//返回顏色表首地址
BYTE* GetData();//返回圖像數據首地址
BITMAPINFO* GetInfo();//獲得BITMAPINFO結構體
WORD PaletteSize(LPBYTE lpDIB);//
WORD DIBNumColors(LPBYTE lpDIB);//返回位圖顏色數目
void SaveFile(const CString Filename);//存儲位圖文件
void LoadFile(CString dibFileName);//裝載位圖文件
};
#endif
DIB類的實現DIB.CPP
#include "stdafx.h"
#include "Dib.h"
#include "windowsx.h"
CDib::CDib()
{
size=0;
}
CDib::~CDib()
{
GlobalFreePtr(m_pBitmapInfo);
}
void CDib::LoadFile(CString
dibFileName)
{
m_fileName.Format(_T("%s"),
dibFileName); //將路徑名拷貝到參數m_fileName
CFile
dibFile(m_fileName,
CFile::modeRead);//創(chuàng)建CFile類對象,只讀方式
dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
//讀取文件頭的內容
if
(bitmapFileHeader.bfType == 0x4d42)
{
DWORD fileLength = dibFile.GetLength();//讀取文件的大小
size = fileLength -sizeof(BITMAPFILEHEADER);
//文件大小-文件頭結構體的大小
//先分配size大小的內存,接著鎖定內存塊,然后返回指針,可以用該指針來操作該內存
pDib =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,
size);//分配一段size大小的內存段,返回該內存區(qū)域頭指針
dibFile.Read((void*)pDib,
size);//通過讀取,把讀出的數據存入剛才分配的內存之中
dibFile.Close();
m_pBitmapInfo = (BITMAPINFO*)
pDib;//BITMAPINFO結構體指針指向該內存
m_pBitmapInfoHeader = (BITMAPINFOHEADER*)
pDib;//信息頭指向該內存
m_pRGB = (RGBQUAD*)(pDib +
m_pBitmapInfoHeader->biSize);
//調色板指針指向該內存的調色板部分。因為pDib原本指向信息頭,偏移40字節(jié)(信息頭結構體的大小)之后便到了調色板部分,因此用加法來實現指針的偏移
int m_numberOfColors =
GetNumberOfColors();//調用GetNumberOfColors函數來得到顏色數
if (m_pBitmapInfoHeader->biClrUsed ==
0)
m_pBitmapInfoHeader->biClrUsed = m_numberOfColors;
//把顏色數賦予biClrUsed之中
DWORD colorTableSize = m_numberOfColors
*sizeof(RGBQUAD);//用每個調色板結構體大小乘以顏色數量,得到調色板的大小
m_pData = pDib + m_pBitmapInfoHeader->biSize+
colorTableSize;//這時候代表把m_pData指針指向實際圖像數據了
if (m_pRGB == (RGBQUAD*)m_pData)
//如果調色板指針位置和實際圖像位置指針指向位置相同,那就代表沒有調色板
m_pRGB = NULL;//指針賦予空
m_pBitmapInfoHeader->biSizeImage =
GetSize();//賦予實際位圖的大小
m_valid = TRUE;
}
else
{
m_valid = FALSE;
AfxMessageBox("This isn't a bitmap file!");
}
}
BOOL CDib::IsValid()
{
return
m_valid;
}
CString CDib::GetFileName()
{
return
m_fileName;
}
UINT CDib::GetWidth()
{
return
(UINT)
m_pBitmapInfoHeader->biWidth;
}
UINT CDib::GetHeight()
{
return
(UINT)
m_pBitmapInfoHeader->biHeight;
}
DWORD CDib::GetSize()
{
if
(m_pBitmapInfoHeader->biSizeImage !=
0)
return
m_pBitmapInfoHeader->biSizeImage;
else
{
DWORD height = (DWORD) GetHeight();
DWORD width = (DWORD) GetWidth();
return height * width;
}
}
UINT
CDib::GetNumberOfColors()
{
int numberOfColors;
if
((m_pBitmapInfoHeader->biClrUsed == 0)
&&
(m_pBitmapInfoHeader->biBitCount <
9))
//biClrUsed表示實際用到的顏色數,若0為2的biBitCount次中顏色
//biBitCount為用到的顏色的位數,小于9則表示最大為8位,那么之多為256色
{
switch
(m_pBitmapInfoHeader->biBitCount)
{
case 1: numberOfColors = 2; break;
case 4: numberOfColors = 16; break;
case 8: numberOfColors = 256;
}
}
else
numberOfColors = (int)
m_pBitmapInfoHeader->biClrUsed;
return
numberOfColors;
}
BYTE* CDib::GetData()
{
return m_pData;
}
RGBQUAD* CDib::GetRGB()
{
return m_pRGB;
}
BITMAPINFO* CDib::GetInfo()
{
return m_pBitmapInfo;
}
WORD CDib::PaletteSize(LPBYTE
lpDIB)
{
return (DIBNumColors(lpDIB)*sizeof(RGBTRIPLE));
}
WORD CDib::DIBNumColors(LPBYTE
lpDIB)
{
WORD
wBitCount; // DIB bit count
wBitCount =
((LPBITMAPCOREHEADER)lpDIB)->bcBitCount;
switch
(wBitCount)
{
case 1:
return 2;
case 4:
return 16;
case 8:
return 256;
default:
return 0;
}
}
void CDib::SaveFile(const CString
filename)
{
char m_filename[256];;
strcpy(m_filename,filename);
CFile
dibFile(m_filename,CFile::modeCreate|CFile::modeWrite);
dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.Write((void*)pDib,size);
dibFile.Close();
}
總結
以上是生活随笔為你收集整理的java dib文件 加位图文件头_DIB类头文件和DIB类的实现DIB.CPP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚂蚁森林能量,微信运动排行榜,步数刷新
- 下一篇: NFC手机上基于软件的卡模拟 重大利好还