社区
多媒体/流媒体开发
帖子详情
biClrUsed这个到底是表示什么的?
llcabcde
2008-06-06 08:56:09
我查到,这个biClrUsed是 位图实际使用的颜色表中的颜色数,但是我还是不是很明白,谁能举个例子详细说说,多谢了!
...全文
944
1
打赏
收藏
biClrUsed这个到底是表示什么的?
我查到,这个biClrUsed是 位图实际使用的颜色表中的颜色数,但是我还是不是很明白,谁能举个例子详细说说,多谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
oursrabbit
2010-03-18
打赏
举报
回复
biClrUsed
1位 4位 8位用来存调色板大小 分别为 1x4bit 4x4bit 8x4bit
对于16位图 biClrUsed存0时 调色板大小为16x4bit
以上4bit中数据位 00000000 RRRRRRRR GGGGGGGG BBBBBBBB
对于16位图还有一种颜色算法,biClrUsed存的是掩码。
对于24位,32位biClrUsed存的是掩码。
掩码:类似一种公式,将一个任意数值转换为标准数值。
比如子网掩码为255.255.0.0,ip地址为192.168.xxx.xxx网号为192.168.0.0
用ip&掩码就可以得到此ip的网号
VB生成动态的水波效果.rar
VB技术生成动态的水波效果,压缩包内VB版云效果为标准版本,VB版云效果(提速版)为优化提速版本,云效果和水波效果在代码中有核心的生成函数,使用时可单独摘录出来。 Private Type RGBQUAD '只有
bi
bi
tcount为1,2,4时才有调色板 Blue As Byte '蓝色分量 Green As Byte '绿色分量 Red As Byte '红色分量 Reserved As Byte '保留值 End Type Private Type
BI
TMAPINFOHEADER '40 bytes
bi
Size As Long '
BI
TMAPINFOHEADER结构的大小
bi
Planes As Integer '设备的为平面数,现在都是1
bi
Bi
tCount As Integer '图像的颜色位图
bi
Compression As Long '压缩方式
bi
SizeImage As Long '实际的位图数据所占字节
bi
XPelsPerMeter As Long '目标设备的水平分辨率
bi
YPelsPerMeter As Long '目标设备的垂直分辨率
bi
Clr
U
sed
As Long '使用的颜色数
bi
Clr
Important As Long '重要的颜色数。如果该项为0,
表示
所有颜色都是重要的
CDIB类完全代码
用于图片处理,包括打开,存储,移动等,。 //====================================================================== // 文件: Dib.cpp // 内容: 设备无关位图类-源文件 // 功能: (1)位图的加载与保存; // (2)位图信息的获取; // (3)位图数据的获取; // (3)位图的显示; // (4)位图的转换; // (5)位图相关判断; //====================================================================== #include "StdAfx.h" #include "Dib.h" //======================================================= // 函数功能: 构造函数,初始化数据成员 // 输入参数: 无 // 返回值: 无 //======================================================= CDib::CDib(void) { // 数据成员初始化 strcpy(m_fileName, ""); m_lpBmpFileHeader = NULL; m_lpDib = NULL; m_lpBmpInfo = NULL; m_lpBmpInfoHeader = NULL; m_lpRgbQuad = NULL; m_lpData = NULL; m_hPalette = NULL; m_bHasRgbQuad = FALSE; m_bValid = FALSE; m_rgbsum=0; } //======================================================= // 函数功能: 析构函数,释放内存空间 // 输入参数: 无 // 返回值: 无 //======================================================= CDib::~CDib(void) { // 清理空间 Empty(); } //======================================================= // 函数功能: 从文件加载位图 // 输入参数: LPCTSTR lpszPath-待加载位图文件路径 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL CDib::LoadFromFile(LPCTSTR lpszPath) { // 记录位图文件名 strcpy(m_fileName, lpszPath); // 以读模式打开位图文件 CFile dibFile; if(!dibFile.Open(m_fileName, CFile::modeRead | CFile::shareDenyWrite)) { return FALSE; } // 清理空间 Empty(FALSE); // 为位图文件头分配空间,并初始化为0 m_lpBmpFileHeader = (LP
BI
TMAPFILEHEADER)new BYTE[sizeof(
BI
TMAPFILEHEADER)]; memset(m_lpBmpFileHeader, 0, sizeof(
BI
TMAPFILEHEADER)); // 读取位图文件头 int nCount = dibFile.Read((void *)m_lpBmpFileHeader, sizeof(
BI
TMAPFILEHEADER)); if(nCount != sizeof(
BI
TMAPFILEHEADER)) { return FALSE; } // 判断此文件是不是位图文件(“0x4d42”代表“BM”) if(m_lpBmpFileHeader->bfType == 0x4d42) { // 是位图文件 //AfxMessageBox("m_lpBmpFileHeader->bfType == 0x4d42"); // 计算除位图文件头的空间大小,分配空间并初始化为0 DWORD dwDibSize = dibFile.GetLength() - sizeof(
BI
TMAPFILEHEADER); m_lpDib = new BYTE[dwDibSize]; //(LPBYTE) new BYTE[lHeight*lineBytes24] //m_lpOldDib = new BYTE[dwDibSize]; memset(m_lpDib, 0, dwDibSize); //memset(m_lpOldDib, 0, dwDibSize); // 读取除位图文件头的所有数据 dibFile.Read(m_lpDib, dwDibSize); //dibFile.Read(m_lpOldDib, dwDibSize); // 关闭位图文件 dibFile.Close(); // 设置位图信息指针 m_lpBmpInfo = (LP
BI
TMAPINFO)m_lpDib; // 设置位图信息头指针 m_lpBmpInfoHeader = (LP
BI
TMAPINFOHEADER)m_lpDib; // 设置位图颜色表指针 m_lpRgbQuad = (LPRGBQUAD)(m_lpDib + m_lpBmpInfoHeader->
bi
Size); // 如果位图没有设置位图使用的颜色数,设置它 if(m_lpBmpInfoHeader->
bi
Clr
U
sed
== 0) { m_lpBmpInfoHeader->
bi
Clr
U
sed
= GetNumOfColor(); //AfxMessageBox("24位"); //CString strColor; //strColor.Format("m_lpBmpInfoHeader->
bi
Clr
U
sed
:%d",m_lpBmpInfoHeader->
bi
Clr
U
sed
); //AfxMessageBox(strColor); } // 计算颜色表长度 DWORD dwRgbQuadLength = CalcRgbQuadLength(); //m_lpBmpInfoHeader->
bi
Planes = 1; //CString strColor; //strColor.Format("m_lpBmpInfoHeader->
bi
Compression :%d", m_lpBmpInfoHeader->
bi
Planes); //AfxMessageBox(strColor); // 设置位图数据指针 //m_lpData = m_lpDib + m_lpBmpInfoHeader->
bi
Size + dwRgbQuadLength; m_lpData = m_lpDib + m_lpBmpInfoHeader->
bi
Size + dwRgbQuadLength; //m_lpOldData= m_lpOldDib + ((LP
BI
TMAPINFOHEADER)m_lpOldDib)->
bi
Size + dwRgbQuadLength; // 判断是否有颜色表 if(m_lpRgbQuad == (LPRGBQUAD)m_lpData) { m_lpRgbQuad = NULL; // 将位图颜色表指针置空 m_bHasRgbQuad = FALSE; // 无颜色表 //AfxMessageBox("无颜色表"); } else { m_bHasRgbQuad = TRUE; // 有颜色表 MakePalette(); // 根据颜色表生成调色板 //AfxMessageBox("加载生成调色板"); } // 设置位图大小(因为很多位图文件都不设置此项) m_lpBmpInfoHeader->
bi
SizeImage = GetSize(); // 位图有效 m_bValid = TRUE; return TRUE; } else { // 不是位图文件 AfxMessageBox("该图不是位图!"); m_bValid = FALSE; return FALSE; } } //======================================================= // 函数功能: 将位图保存到文件 // 输入参数: LPCTSTR lpszPath-位图文件保存路径 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= /*BOOL CDib::SaveToFile(LPCTSTR lpszPath) { // 以写模式打开文件 HDC hdc,hdcMem; H
BI
TMAP h
Bi
tMap = NULL; C
Bi
tmap *p
Bi
tMap = NULL; CDC *pMemDC = NULL; BYTE *p
Bi
ts; hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL); hdcMem = CreateCompatibleDC(hdc); h
Bi
tMap = CreateDIBSection(hdcMem,m_lpBmpInfo,DIB_PAL_COLORS,(void **)&p
Bi
ts,NULL,0); p
Bi
tMap = new C
Bi
tmap; p
Bi
tMap->Attach(h
Bi
tMap); pMemDC = new CDC; pMemDC->Attach(hdcMem); pMemDC->SelectObject(p
Bi
tMap); pMemDC->SetBkMode(TRANSPARENT); //pMemDC->SetBkMode(OPAQUE); //添加自绘图形 m_myview->DrawLine(pMemDC); CFile dibFile; if(!dibFile.Open(lpszPath, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive)) { return FALSE; } // 记录位图文件名 strcpy(m_fileName, lpszPath); // 将文件头结构写进文件 dibFile.Write(m_lpBmpFileHeader, sizeof(
BI
TMAPFILEHEADER)); // 将文件信息头结构写进文件 dibFile.Write(m_lpBmpInfoHeader, sizeof(
BI
TMAPINFOHEADER)); // 计算颜色表长度 DWORD dwRgbQuadlength = CalcRgbQuadLength(); // 如果有颜色表的话,将颜色表写进文件 if(dwRgbQuadlength != 0) { dibFile.Write(m_lpRgbQuad, dwRgbQuadlength); } // 将位图数据写进文件 DWORD dwDataSize = GetLineByte() * GetHeight(); dibFile.Write(m_lpData, dwDataSize); // 关闭文件 dibFile.Close(); return TRUE; } */ //======================================================= // 函数功能: 获取位图文件名 // 输入参数: 无 // 返回值: LPCTSTR-位图文件名 //======================================================= LPCTSTR CDib::GetFileName() { return m_fileName; } //======================================================= // 函数功能: 获取位图宽度 // 输入参数: 无 // 返回值: LONG-位图宽度 //======================================================= LONG CDib::GetWidth() { return m_lpBmpInfoHeader->
bi
Width; } //======================================================= // 函数功能: 获取位图高度 // 输入参数: 无 // 返回值: LONG-位图高度 //======================================================= LONG CDib::GetHeight() { return m_lpBmpInfoHeader->
bi
Height; } //======================================================= // 函数功能: 获取位图的宽度和高度 // 输入参数: 无 // 返回值: CSize-位图的宽度和高度 //======================================================= CSize CDib::GetDimension() { return CSize(GetWidth(), GetHeight()); } //======================================================= // 函数功能: 获取位图大小 // 输入参数: 无 // 返回值: DWORD-位图大小 //======================================================= DWORD CDib::GetSize() { if(m_lpBmpInfoHeader->
bi
SizeImage != 0) { return m_lpBmpInfoHeader->
bi
SizeImage; } else { return GetWidth() * GetHeight(); } } //======================================================= // 函数功能: 获取单个像素所占位数 // 输入参数: 无 // 返回值: WORD-单个像素所占位数 //======================================================= WORD CDib::Get
Bi
tCount() { return m_lpBmpInfoHeader->
bi
Bi
tCount; } //======================================================= // 函数功能: 获取每行像素所占字节数 // 输入参数: 无 // 返回值: UINT-每行像素所占字节数 //======================================================= UINT CDib::GetLineByte() { return (GetWidth() * Get
Bi
tCount() /8 + 3) / 4 * 4; } //======================================================= // 函数功能: 获取位图颜色数 // 输入参数: 无 // 返回值: DWORD-位图颜色数 //======================================================= DWORD CDib::GetNumOfColor() { UINT dwNumOfColor; if ((m_lpBmpInfoHeader->
bi
Clr
U
sed
== 0) && (m_lpBmpInfoHeader->
bi
Bi
tCount < 9)) { switch (m_lpBmpInfoHeader->
bi
Bi
tCount) { case 1: dwNumOfColor = 2; break; case 4: dwNumOfColor = 16; break; case 8: dwNumOfColor = 256; } } else { dwNumOfColor = m_lpBmpInfoHeader->
bi
Clr
U
sed
; //CString strColor; //strColor.Format("dwNumOfColor:%d",dwNumOfColor); //AfxMessageBox(strColor); } return dwNumOfColor; } //======================================================= // 函数功能: 计算位图颜色表长度 // 输入参数: 无 // 返回值: DWORD-位图颜色表长度 //======================================================= DWORD CDib::CalcRgbQuadLength() { DWORD dwNumOfColor = GetNumOfColor(); if(dwNumOfColor > 256) { dwNumOfColor = 0; } CString strColor; strColor.Format("dwNumOfColor:%d",dwNumOfColor); //AfxMessageBox(strColor); return dwNumOfColor * sizeof(RGBQUAD); } //======================================================= // 函数功能: 计算位图像素的起始位置 // 输入参数: 无 // 返回值: LPBYTE-位图像素的起始位置 //======================================================= LPBYTE CDib::Get
Bi
ts() { return (m_lpDib+((LP
BI
TMAPINFOHEADER)m_lpDib)->
bi
Size+CalcRgbQuadLength()); } //======================================================= // 函数功能: 获取位图颜色表 // 输入参数: 无 // 返回值: LPRGBQUAD-位图颜色表指针 //======================================================= LPRGBQUAD CDib::GetRgbQuad() { return m_lpRgbQuad; } //======================================================= // 函数功能: 获取位图数据 // 输入参数: 无 // 返回值: LPBYTE-位图数据指针 //======================================================= LPBYTE CDib::GetData() { return m_lpData; } //======================================================= // 函数功能: 根据颜色表生成调色板 // 输入参数: 无 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL CDib::MakePalette() { // 计算颜色表长度 DWORD dwRgbQuadLength = CalcRgbQuadLength(); CString strColor; strColor.Format("dwRgbQuadLength:%d",dwRgbQuadLength); //AfxMessageBox(strColor); // 如果颜色表长度为0,则不生成逻辑调色板 if(dwRgbQuadLength == 0) { return FALSE; } //删除旧的调色板对象 if(m_hPalette != NULL) { DeleteObject(m_hPalette); m_hPalette = NULL; } // 申请缓冲区,初始化为0 DWORD dwNumOfColor = GetNumOfColor(); DWORD dwSize = 2 * sizeof(WORD) + dwNumOfColor * sizeof(PALETTEENTRY); LPLOGPALETTE lpLogPalette = (LPLOGPALETTE) new BYTE[dwSize]; memset(lpLogPalette, 0, dwSize); // 生成逻辑调色板 lpLogPalette->palVersion = 0x300; lpLogPalette->palNumEntries = dwNumOfColor; LPRGBQUAD lpRgbQuad = (LPRGBQUAD) m_lpRgbQuad; for(int i = 0; i < dwNumOfColor; i++) { lpLogPalette->palPalEntry[i].peRed = lpRgbQuad->rgbRed; lpLogPalette->palPalEntry[i].peGreen = lpRgbQuad->rgbGreen; lpLogPalette->palPalEntry[i].peBlue = lpRgbQuad->rgbBlue; lpLogPalette->palPalEntry[i].peFlags = 0; lpRgbQuad++; } // 创建逻辑调色板 m_hPalette = CreatePalette(lpLogPalette); // 释放缓冲区 delete [] lpLogPalette; return TRUE; } //======================================================= // 函数功能: 显示位图 // 输入参数: // CDC *pDC-设备环境指针 // CPoint origin-显示矩形区域的左上角 // CSize size-显示矩形区域的尺寸 // 返回值: // BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL CDib::Draw(CDC *pDC, CPoint origin, CSize size) { // 位图无效,无法绘制,返回错误 if(!IsValid()) { return FALSE; } // 旧的调色板句柄 HPALETTE hOldPalette = NULL; // 如果位图指针为空,则返回FALSE if(m_lpDib == NULL) { return FALSE; } // 如果位图有调色板,则选进设备环境中 if(m_hPalette != NULL) { hOldPalette = SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE); } // 设置位图伸缩模式 pDC->SetStretchBltMode(COLORONCOLOR); // 将位图在pDC所指向的设备上进行显示 StretchDI
Bi
ts(pDC->GetSafeHdc(), origin.x, origin.y, size.cx, size.cy, 0, 0, GetWidth(), GetHeight(), m_lpData, m_lpBmpInfo, DIB_RGB_COLORS, SRCCOPY); // 恢复旧的调色板 if(hOldPalette != NULL) { SelectPalette(pDC->GetSafeHdc(), hOldPalette, TRUE); } return TRUE; } //======================================================= // 函数功能: 24位彩色位图转8位灰度位图 // 输入参数: 无 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL CDib::RgbToGrade() { // 位图无效,失败返回 if(!IsValid()) { AfxMessageBox("该位图无效!"); return FALSE; } // 是压缩位图,失败返回 if(m_lpBmpInfoHeader->
bi
Compression !=
BI
_RGB) { return FALSE; } // 如果不是灰度位图,才需要转换 if(!IsGrade()) { // 获取原位图信息 LONG lHeight = GetHeight(); LONG lWidth = GetWidth(); UINT uLineByte = GetLineByte(); // 计算灰度位图数据所需空间 UINT uGradeBmpLineByte = (lWidth * 8 / 8 + 3) / 4 * 4; DWORD dwGradeBmpDataSize = uGradeBmpLineByte * lHeight; // 计算灰度位图所需空间 DWORD dwGradeBmpSize = sizeof(
BI
TMAPINFOHEADER) + sizeof(RGBQUAD) * 256 + dwGradeBmpDataSize; // 设置灰度位图文件头 LP
BI
TMAPFILEHEADER lpGradeBmpFileHeader = (LP
BI
TMAPFILEHEADER)new BYTE[sizeof(
BI
TMAPFILEHEADER)]; memset(lpGradeBmpFileHeader, 0, sizeof(
BI
TMAPFILEHEADER)); lpGradeBmpFileHeader->bfType = 0x4d42; lpGradeBmpFileHeader->bfSize = sizeof(
BI
TMAPFILEHEADER) + dwGradeBmpSize; lpGradeBmpFileHeader->bfOff
Bi
ts = sizeof(
BI
TMAPFILEHEADER) + sizeof(
BI
TMAPINFOHEADER) + sizeof(RGBQUAD) * 256; lpGradeBmpFileHeader->bfReserved1 = 0; lpGradeBmpFileHeader->bfReserved2 = 0; // 为灰度位图分配空间,并初始化为0 LPBYTE lpGradeBmp = (LPBYTE)new BYTE[dwGradeBmpSize]; memset(lpGradeBmp, 0, dwGradeBmpSize); // 设置灰度位图信息头 LP
BI
TMAPINFOHEADER lpGradeBmpInfoHeader = (LP
BI
TMAPINFOHEADER)(lpGradeBmp); lpGradeBmpInfoHeader->
bi
Bi
tCount = 8; lpGradeBmpInfoHeader->
bi
Clr
Important = 0; lpGradeBmpInfoHeader->
bi
Clr
U
sed
= 256; lpGradeBmpInfoHeader->
bi
Compression =
BI
_RGB; lpGradeBmpInfoHeader->
bi
Height = lHeight; lpGradeBmpInfoHeader->
bi
Planes = 1; lpGradeBmpInfoHeader->
bi
Size = sizeof(
BI
TMAPINFOHEADER); lpGradeBmpInfoHeader->
bi
SizeImage = dwGradeBmpDataSize; lpGradeBmpInfoHeader->
bi
Width = lWidth; lpGradeBmpInfoHeader->
bi
XPelsPerMeter = m_lpBmpInfoHeader->
bi
XPelsPerMeter; lpGradeBmpInfoHeader->
bi
YPelsPerMeter = m_lpBmpInfoHeader->
bi
YPelsPerMeter; // 设置灰度位图颜色表 LPRGBQUAD lpGradeBmpRgbQuad = (LPRGBQUAD)(lpGradeBmp + sizeof(
BI
TMAPINFOHEADER)); // 初始化8位灰度图的调色板信息 LPRGBQUAD lpRgbQuad; for(int k = 0; k < 256; k++) { lpRgbQuad = (LPRGBQUAD)(lpGradeBmpRgbQuad + k); lpRgbQuad->rgbBlue = k; lpRgbQuad->rgbGreen = k; lpRgbQuad->rgbRed = k; lpRgbQuad->rgbReserved = 0; } // 灰度位图数据处理 BYTE r, g, b; LPBYTE lpGradeBmpData = (LPBYTE)(lpGradeBmp + sizeof(
BI
TMAPINFOHEADER) + sizeof(RGBQUAD) * 256); // 进行颜色转换 for(int i = 0; i < lHeight; i++) { for(int j = 0; j < lWidth; j++) { b = m_lpData[i * uLineByte + 3 * j]; g = m_lpData[i * uLineByte + 3 * j + 1]; r = m_lpData[i * uLineByte + 3 * j + 2]; lpGradeBmpData[i * uGradeBmpLineByte + j] = (BYTE)(0.299 * r + 0.587 * g + 0.114 * b); } } // 释放原有位图空间 Empty(FALSE); // 重新设定原位图指针指向 m_lpBmpFileHeader = lpGradeBmpFileHeader; m_lpDib = lpGradeBmp; m_lpBmpInfo = (LP
BI
TMAPINFO)(lpGradeBmp); m_lpBmpInfoHeader = lpGradeBmpInfoHeader; m_lpRgbQuad = lpGradeBmpRgbQuad; m_lpData = lpGradeBmpData; // 设置颜色表标志 m_bHasRgbQuad = TRUE; // 设置位图有效标志 m_bValid = TRUE; // 生成调色板 MakePalette(); } AfxMessageBox("转换成功,请保存8位灰度图!"); return TRUE; } //======================================================= // 函数功能: 8位彩色位图转24位彩色图 // 输入参数: 无 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL CDib::GraphToRgb() { // 位图无效,失败返回 if(!IsValid()) { AfxMessageBox("该位图无效!"); return FALSE; } // 是压缩位图,失败返回 if(m_lpBmpInfoHeader->
bi
Compression !=
BI
_RGB) { return FALSE; } if(Get
Bi
tCount()==24) { AfxMessageBox("该位图已是24位,不用转换!"); return FALSE; } if(Get
Bi
tCount()!=8) { AfxMessageBox("该位图不是8位,不能转换,请用画图软件将其另存为成24位图!"); return FALSE; } // 如果不是24位图,才需要转换 // 获取原位图信息 LONG lHeight = GetHeight(); LONG lWidth = GetWidth(); UINT uLineByte = GetLineByte(); // 计算24位图数据所需空间 //return (GetWidth() * Get
Bi
tCount() /8 + 3) / 4 * 4; UINT uGradeBmpLineByte = (lWidth * 24/8 + 3) / 4 * 4; DWORD dwGradeBmpDataSize = uGradeBmpLineByte * lHeight; // 计算24位图所需空间 DWORD dwGradeBmpSize = sizeof(
BI
TMAPINFOHEADER) + sizeof(RGBQUAD) * 0 + dwGradeBmpDataSize; // 设置24位图文件头 LP
BI
TMAPFILEHEADER lpGradeBmpFileHeader = (LP
BI
TMAPFILEHEADER)new BYTE[sizeof(
BI
TMAPFILEHEADER)]; memset(lpGradeBmpFileHeader, 0, sizeof(
BI
TMAPFILEHEADER)); lpGradeBmpFileHeader->bfType = 0x4d42; lpGradeBmpFileHeader->bfSize = sizeof(
BI
TMAPFILEHEADER) + dwGradeBmpSize; lpGradeBmpFileHeader->bfOff
Bi
ts = sizeof(
BI
TMAPFILEHEADER) + sizeof(
BI
TMAPINFOHEADER); lpGradeBmpFileHeader->bfReserved1 = 0; lpGradeBmpFileHeader->bfReserved2 = 0; // 为24位图分配空间,并初始化为0 LPBYTE lpGradeBmp = (LPBYTE)new BYTE[dwGradeBmpSize]; memset(lpGradeBmp, 0, dwGradeBmpSize); // 设置24位图信息头 LP
BI
TMAPINFOHEADER lpGradeBmpInfoHeader = (LP
BI
TMAPINFOHEADER)(lpGradeBmp); lpGradeBmpInfoHeader->
bi
Bi
tCount = 24; lpGradeBmpInfoHeader->
bi
Clr
Important = 0; lpGradeBmpInfoHeader->
bi
Clr
U
sed
= 0; lpGradeBmpInfoHeader->
bi
Compression =
BI
_RGB; lpGradeBmpInfoHeader->
bi
Height = lHeight; lpGradeBmpInfoHeader->
bi
Planes = 1; lpGradeBmpInfoHeader->
bi
Size = sizeof(
BI
TMAPINFOHEADER); lpGradeBmpInfoHeader->
bi
SizeImage = dwGradeBmpDataSize; lpGradeBmpInfoHeader->
bi
Width = lWidth; lpGradeBmpInfoHeader->
bi
XPelsPerMeter = 0; lpGradeBmpInfoHeader->
bi
YPelsPerMeter = 0; // 设置24位图颜色表 //LPRGBQUAD lpGradeBmpRgbQuad = (LPRGBQUAD)(lpGradeBmp + sizeof(
BI
TMAPINFOHEADER)); // 初始化8位灰度图的调色板信息 /*LPRGBQUAD lpRgbQuad; for(int k = 0; k < 256; k++) { lpRgbQuad = (LPRGBQUAD)(lpGradeBmpRgbQuad + k); lpRgbQuad->rgbBlue = k; lpRgbQuad->rgbGreen = k; lpRgbQuad->rgbRed = k; lpRgbQuad->rgbReserved = 0; }*/ // 24位图数据处理 //BYTE r, g, b; //LPBYTE lpGradeBmpData = (LPBYTE)(lpGradeBmp + sizeof(
BI
TMAPINFOHEADER) + sizeof(RGBQUAD) * 0); // 进行颜色转换 LONG lineBytes24=(lWidth * 24 / 8 + 3) / 4 * 4; LONG lineBytes8=(lWidth * 8 / 8 + 3) / 4 * 4; //LONG lineBytes24=(lWidth * 24 + 31) / 32 * 4; //LONG lineBytes8=(lWidth * 8 + 31) / 32 * 4; //CString strColor; //strColor.Format("lineBytes24 :%d,lineBytes8 :%d", lineBytes24,lineBytes8); //AfxMessageBox(strColor); LPBYTE lpGradeBmpData =(LPBYTE) new BYTE[lHeight*lineBytes24]; for(int i = 0; i < lHeight; i++) { for(int j = 0,n=0; j < lineBytes8; j++,n++) { BYTE gray=*(m_lpData+lineBytes8*i+j); *(lpGradeBmpData+lineBytes24*i+n)=gray; n++; *(lpGradeBmpData+lineBytes24*i+n)=gray; n++; *(lpGradeBmpData+lineBytes24*i+n)=gray; /*lpGradeBmpData[lineBytes24*i+j ]= m_lpData[lineBytes8*i+j]; lpGradeBmpData[lineBytes24*i+j+1]= m_lpData[lineBytes8*i+j]; lpGradeBmpData[lineBytes24*i+j+2]= m_lpData[lineBytes8*i+j];*/ } } // 释放原有位图空间 //AfxMessageBox("转换成功"); Empty(FALSE); // 重新设定原位图指针指向 m_lpBmpFileHeader = lpGradeBmpFileHeader; m_lpDib = lpGradeBmp; m_lpBmpInfo = (LP
BI
TMAPINFO)(lpGradeBmp); m_lpBmpInfoHeader = lpGradeBmpInfoHeader; //m_lpRgbQuad = lpGradeBmpRgbQuad; m_lpData = lpGradeBmpData; // 设置颜色表标志 //m_bHasRgbQuad = TRUE; // 设置位图有效标志 m_bValid = TRUE; // 生成调色板 //MakePalette(); AfxMessageBox("转换成功,请保存24位图!"); return TRUE; } //======================================================= // 函数功能: 判断是否含有颜色表 // 输入参数: 无 // 返回值: 判断结果:TRUE-含有颜色表;FALSE-不含颜色表 //======================================================= BOOL CDib::HasRgbQuad() { return m_bHasRgbQuad; } //======================================================= // 函数功能: 判断是否是灰度图 // 输入参数: 无 // 返回值: 判断结果:TRUE-是灰度图;FALSE-是彩色图 //======================================================= BOOL CDib::IsGrade() { return (Get
Bi
tCount() < 9 && Get
Bi
tCount() > 0); } //======================================================= // 函数功能: 判断位图是否有效 // 输入参数: 无 // 返回值: 判断结果:TRUE-位图有效;FALSE-位图无效 //======================================================= BOOL CDib::IsValid() { return m_bValid; } //======================================================= // 函数功能: 清理空间 // 输入参数: BOOL bFlag-TRUE 全部清空;FALSE 部分清空 // 返回值: 无 //======================================================= void CDib::Empty(BOOL bFlag) { // 文件名清空 if(bFlag) { strcpy(m_fileName, ""); } // 释放位图文件头指针空间 if(m_lpBmpFileHeader != NULL) { delete [] m_lpBmpFileHeader; m_lpBmpFileHeader = NULL; } // 释放位图指针空间 if(m_lpDib != NULL) { delete [] m_lpDib; m_lpDib = NULL; m_lpBmpInfo = NULL; m_lpBmpInfoHeader = NULL; m_lpRgbQuad = NULL; m_lpData = NULL; } // 释放调色板 if(m_hPalette != NULL) { DeleteObject(m_hPalette); m_hPalette = NULL; } // 设置不含颜色表 m_bHasRgbQuad = FALSE; // 设置位图无效 m_bValid = FALSE; } BOOL CDib::Count
Clr
(int r,int g,int b,int fanwei) { m_rgbsum=0; // 位图无效,失败返回 if(!IsValid()) { AfxMessageBox("该位图无效!"); return FALSE; } if(Get
Bi
tCount()!=24) { CString str; str.Format("该位图是%d位,无法统计,请用画图软件将其另存为成24位图!",Get
Bi
tCount()); AfxMessageBox(str); return FALSE; } // 是压缩位图,失败返回 if(m_lpBmpInfoHeader->
bi
Compression !=
BI
_RGB) { return FALSE; } //LoadFromFile((LPCTSTR)m_fileName); // 获取原位图信息 LONG lHeight=GetHeight(); LONG lWidth=GetWidth(); UINT uLineByte=GetLineByte(); // 灰度位图数据处理 int R=0, G=0, B=0; //int R1=0, G1=0, B1=0; // 进行颜色转换 int
clr
fanwei; int
clr
jizhun=0.299 * r + 0.587 * g + 0.114 * b;//基准灰度 for(int i = 0; i < lHeight; i++) { for(int j = 0; j < lWidth; j++) { //(BYTE)(0.299 * r + 0.587 * g + 0.114 * b); B = *(m_lpData+i * uLineByte + 3 * j); G = *(m_lpData+i * uLineByte + 3 * j + 1); R = *(m_lpData+i * uLineByte + 3 * j + 2); int someonegray=0.299 * R + 0.587 * G + 0.114 * B; if(
clr
jizhun<128)//标定深色区域为缺陷 {
clr
fanwei=
clr
jizhun+fanwei; if(
clr
fanwei>255)
clr
fanwei=255; if(someonegray<=
clr
fanwei && someonegray>=
clr
jizhun) { if(r==255 && g==0 && b==0) { *(m_lpData+i * uLineByte + 3 * j)=255; *(m_lpData+i * uLineByte + 3 * j + 1)=0; *(m_lpData+i * uLineByte + 3 * j + 2)=0; } else { *(m_lpData+i * uLineByte + 3 * j)=0; *(m_lpData+i * uLineByte + 3 * j + 1)=0; *(m_lpData+i * uLineByte + 3 * j + 2)=255; } m_rgbsum++; } } else//标定浅色区域为缺陷 {
clr
fanwei=
clr
jizhun-fanwei; if(
clr
fanwei<0)
clr
fanwei=0; if(someonegray>=
clr
fanwei && someonegray<=
clr
jizhun) { if(r==255 && g==0 && b==0) { *(m_lpData+i * uLineByte + 3 * j)=255; *(m_lpData+i * uLineByte + 3 * j + 1)=0; *(m_lpData+i * uLineByte + 3 * j + 2)=0; } else { *(m_lpData+i * uLineByte + 3 * j)=0; *(m_lpData+i * uLineByte + 3 * j + 1)=0; *(m_lpData+i * uLineByte + 3 * j + 2)=255; } m_rgbsum++; } } } } return TRUE; } BOOL CDib::TranslationRight(long lXOffset,long lYOffset) { long i; long j; long lWidth,lHeight; lWidth=GetWidth(); lHeight=GetHeight(); //LPBYTE lpSrcDIB
Bi
ts; long lLineBytes; lLineBytes=GetLineByte(); if (lXOffset<=0 || lYOffset<=0) { return FALSE; } for(i=0;i
=0) { *(m_lpData+(i+index) * lLineBytes + 3 * (lWidth-j))=*(m_lpData+(i+index) * lLineBytes + 3 * (lWidth-j-lXOffset)); *(m_lpData+(i+index) * lLineBytes + 3 * (lWidth-j) + 1)=*(m_lpData+(i+index) * lLineBytes + 3 * (lWidth-j-lXOffset) + 1); *(m_lpData+(i+index) * lLineBytes + 3 * (lWidth-j) + 2)=*(m_lpData+(i+index)* lLineBytes + 3 * (lWidth-j-lXOffset) + 2); } else { break; } } else { if((i+index)
Bits; long lLineBytes; lLineBytes=GetLineByte(); if (lXOffset<=0 || lYOffset<=0) { return FALSE; } for(i=0;i
C
Bi
tmap,H
Bi
tmap,
Bi
tmap,
BI
TMAP区别及联系
搞了好一阵子的vc了,一直都是在用位图文件。可是一直说位图位图,其
到底
是个什么东西还不是很清楚,只知道后缀为.bmp,其和
Bi
tmap、C
Bi
tmap、H
Bi
tmap的联系和区别是什么也不是很清楚。正好要做一个截图程序,随便查了一些资料。 一:他们
到底
是什么? 1:
到底
什么是位图? 那
到底
什么是位图呢?http://baike.baidu.com/view/7671.htm,从百度百科可以知
位图文件(BMP)
位图文件简介 BMP(
Bi
tmap-File)格式是最常用的图像文件存取格式之一,是微软为其Windows环境设置的标准图像格式,BMP位图文件默认的文件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。用BMP格式存放的图像几乎可以被所有的图像显示软件读取。BMP图形文件是Windows采用的图像文件格式,在Windows环境下运行的所有
DDB和DIB 是什么?区别?
BMP图像文件是Windows 3.X 所采用的图像文件格式,几乎所有Windows 上的应用软件都支持这种图像文件,其中最常见的就是Windows本身所附的绘图软件(Paint-Brush),所以欲在Windows上探讨图像的文件格式,势必要对BMP有一个完整而全面的认识。 BMP图像分为两类,DDB和DIB,DDB(device-dependent b
多媒体/流媒体开发
2,543
社区成员
20,281
社区内容
发帖
与我相关
我的任务
多媒体/流媒体开发
专题开发/技术/项目 多媒体/流媒体开发
复制链接
扫一扫
分享
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章