日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java dib文件 加位图文件头_DIB类头文件和DIB类的实现DIB.CPP

發(fā)布時間:2024/3/26 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java dib文件 加位图文件头_DIB类头文件和DIB类的实现DIB.CPP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

//#ifndef __CDIB_H

#define __CDIB_H

class CDib:public CObject

{

public:

RGBQUAD* m_pRGB;//調(diào)色板指針

BYTE* m_pData;//指向?qū)嶋H圖像數(shù)據(jù)指針

UINT m_numberOfColors;//顏色數(shù)

BOOL m_valid;

BITMAPFILEHEADER bitmapFileHeader;//保存文件頭的內(nèi)容

BITMAPINFOHEADER* m_pBitmapInfoHeader;//信息頭指

LPBITMAPINFO m_pBitmapInfo;//BITMAPINFO結(jié)構(gòu)體指針指

BYTE* pDib;//分配一段size大小的內(nèi)存段,返回該內(nèi)存區(qū)域頭指針

DWORD size; //文件大小-文件頭結(jié)構(gòu)體的大小

public:

CDib();

~CDib();

CString m_fileName;//記錄文件名

CString GetFileName();//返回位圖文件名

BOOL IsValid();

DWORD GetSize();//返回位圖文件大小

UINT GetWidth();//返回位圖的寬度

UINT GetHeight();//返回位圖的高度

UINT GetNumberOfColors();//返回位圖顏色數(shù)目

RGBQUAD* GetRGB();//返回顏色表首地址

BYTE* GetData();//返回圖像數(shù)據(jù)首地址

BITMAPINFO* GetInfo();//獲得BITMAPINFO結(jié)構(gòu)體

WORD PaletteSize(LPBYTE lpDIB);//

WORD DIBNumColors(LPBYTE lpDIB);//返回位圖顏色數(shù)目

void SaveFile(const CString Filename);//存儲位圖文件

void LoadFile(CString dibFileName);//裝載位圖文件

};

#endif

DIB類的實現(xiàn)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); //將路徑名拷貝到參數(shù)m_fileName

CFile

dibFile(m_fileName,

CFile::modeRead);//創(chuàng)建CFile類對象,只讀方式

dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));

//讀取文件頭的內(nèi)容

if

(bitmapFileHeader.bfType == 0x4d42)

{

DWORD fileLength = dibFile.GetLength();//讀取文件的大小

size = fileLength -sizeof(BITMAPFILEHEADER);

//文件大小-文件頭結(jié)構(gòu)體的大小

//先分配size大小的內(nèi)存,接著鎖定內(nèi)存塊,然后返回指針,可以用該指針來操作該內(nèi)存

pDib =(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,

size);//分配一段size大小的內(nèi)存段,返回該內(nèi)存區(qū)域頭指針

dibFile.Read((void*)pDib,

size);//通過讀取,把讀出的數(shù)據(jù)存入剛才分配的內(nèi)存之中

dibFile.Close();

m_pBitmapInfo = (BITMAPINFO*)

pDib;//BITMAPINFO結(jié)構(gòu)體指針指向該內(nèi)存

m_pBitmapInfoHeader = (BITMAPINFOHEADER*)

pDib;//信息頭指向該內(nèi)存

m_pRGB = (RGBQUAD*)(pDib +

m_pBitmapInfoHeader->biSize);

//調(diào)色板指針指向該內(nèi)存的調(diào)色板部分。因為pDib原本指向信息頭,偏移40字節(jié)(信息頭結(jié)構(gòu)體的大小)之后便到了調(diào)色板部分,因此用加法來實現(xiàn)指針的偏移

int m_numberOfColors =

GetNumberOfColors();//調(diào)用GetNumberOfColors函數(shù)來得到顏色數(shù)

if (m_pBitmapInfoHeader->biClrUsed ==

0)

m_pBitmapInfoHeader->biClrUsed = m_numberOfColors;

//把顏色數(shù)賦予biClrUsed之中

DWORD colorTableSize = m_numberOfColors

*sizeof(RGBQUAD);//用每個調(diào)色板結(jié)構(gòu)體大小乘以顏色數(shù)量,得到調(diào)色板的大小

m_pData = pDib + m_pBitmapInfoHeader->biSize+

colorTableSize;//這時候代表把m_pData指針指向?qū)嶋H圖像數(shù)據(jù)了

if (m_pRGB == (RGBQUAD*)m_pData)

//如果調(diào)色板指針位置和實際圖像位置指針指向位置相同,那就代表沒有調(diào)色板

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表示實際用到的顏色數(shù),若0為2的biBitCount次中顏色

//biBitCount為用到的顏色的位數(shù),小于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();

}

總結(jié)

以上是生活随笔為你收集整理的java dib文件 加位图文件头_DIB类头文件和DIB类的实现DIB.CPP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。