社区
图形处理/算法
帖子详情
DIB位图的 biClrused 和 biBitCount 的问题
wanjxy
2015-10-14 11:16:42
biClrused 和 biBitCount,我理解的关系是biClrUsed最大值为biBitCount,不知道对不对?
DIB位图的调色板尺寸到底应该是 biClrUsed*sizeof(RGBQUAD) 还是 2^biBitCount*sizeof(RGBQUAD)……搞了半天分不太清楚
...全文
49
回复
打赏
收藏
DIB位图的 biClrused 和 biBitCount 的问题
biClrused 和 biBitCount,我理解的关系是biClrUsed最大值为biBitCount,不知道对不对? DIB位图的调色板尺寸到底应该是 biClrUsed*sizeof(RGBQUAD) 还是 2^biBitCount*sizeof(RGBQUAD)……搞了半天分不太清楚
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
位图
信息查看程序
DIB
BI
T
MAPINFOHEADER
BI
T
MAPCOREHEADER
查看
位图
的信息(右键查看): 1.文件头 2.信息头 3.RGB掩码(如果有的话) 显示出来的形式如下:
BI
T
MAPFILEHEADER* = 0x02800048
BI
T
MAPFILEHEADER .bfType = 0x4D42 .bfSize = 552158 .bfReserved1 = 0 .bfReserved2 = 0 .bfOff
Bi
t
s = 66
BI
T
MAPINFOHEADER .
bi
Size = 40 .
bi
Width = 353 .
bi
Height = 391 .
bi
Planes = 1 .
bi
Bi
t
Count
= 32 .
bi
Compression =
BI
_
BI
T
FIELDS .
bi
SizeImage = 552092 .
bi
XPelsPerMeter = 0 .
bi
YPelsPerMeter = 0 .
bi
Clr
U
sed
= 0 .
bi
Clr
Important = 0 Red Mask = 00FF0000 Green Mask = 0000FF00 Blue Mask = 000000FF 说明: 1.第一行为内存中malloc出来的地址,由于是虚拟内存,不看也罢 2.该程序不止可以查看
BI
T
MAPINFOHEADER类型的
位图
, 其余三种类型也可查看,分别为:
BI
T
MAPCOREHEADER、
BI
T
MAPV4HEADER、
BI
T
MAPV5HEADER 3.最后三行的RGB Mask是颜色掩码,对于
BI
T
MAPINFOHEADER类型来说,不一定有。 4.右键功能是查看信息,左键是左右镜像操作,由于是底层数据直接每行左右互换, 而对于1、4位深的这两种
位图
,底层数据操作涉及位操作,而我还在写这个
位图
类, 故暂不支持,只支持8位以上的水平镜像操作。 5.支持剪切板操作,并且是以CF_
DIB
或CF_
DIB
V5呼叫GetClipboardData函数的, 复制时,也是以该参数呼叫SetClipboardData函数的。 你可以复制其他地方的图片过来,以查看图片属性。 6.程序中运行中保存在内存中的图片是
BI
T
MAPFILEHEADER*指针,不是H
BI
T
MAP, 呼叫的显示函数是SetDI
Bi
t
sToDevice函数。 7.鼠标在图片上移动是,右边填充鼠标点的颜色,标题栏也有相关显示。 下边显示鼠标点附近11*11像素范围的放大图像,正中间用十字叉线画出。 取色是直接在底层取数据解析。 8.改程序在《windows程序设计》上的一个例子改编而来,并且正在完善该
位图
类中, 以加入更多丰富的底层操作功能。 改试验程序主要供想研究
位图
结构的人查看用。 9.windows搞出了4种
位图
种类,真作孽~~ 另,16、24、32位深的
位图
也可以有颜色表的,该程序已考虑在内。 10.下面四种压缩格式暂不支持:
BI
_RLE8、
BI
_RLE4、
BI
_JPEG、
BI
_PNG 11.随带的附件中,有几张不同格式的
位图
,你可以试验打开查看。 有
问题
联系:hastings1986@163.com
C
DIB
类完全代码
用于图片处理,包括打开,存储,移动等,。 //====================================================================== // 文件:
Dib
.cpp // 内容: 设备无关
位图
类-源文件 // 功能: (1)
位图
的加载与保存; // (2)
位图
信息的获取; // (3)
位图
数据的获取; // (3)
位图
的显示; // (4)
位图
的转换; // (5)
位图
相关判断; //====================================================================== #include "StdAfx.h" #include "
Dib
.h" //======================================================= // 函数功能: 构造函数,初始化数据成员 // 输入参数: 无 // 返回值: 无 //======================================================= C
Dib
::C
Dib
(void) { // 数据成员初始化 strcpy(m_fileName, ""); m_lpBmpFileHeader = NULL; m_lp
Dib
= 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; } //======================================================= // 函数功能: 析构函数,释放内存空间 // 输入参数: 无 // 返回值: 无 //======================================================= C
Dib
::~C
Dib
(void) { // 清理空间 Empty(); } //======================================================= // 函数功能: 从文件加载
位图
// 输入参数: LPCTSTR lpszPath-待加载
位图
文件路径 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL C
Dib
::LoadFromFile(LPCTSTR lpszPath) { // 记录
位图
文件名 strcpy(m_fileName, lpszPath); // 以读模式打开
位图
文件 CFile
dib
File; if(!
dib
File.Open(m_fileName, CFile::modeRead | CFile::shareDenyWrite)) { return FALSE; } // 清理空间 Empty(FALSE); // 为
位图
文件头分配空间,并初始化为0 m_lpBmpFileHeader = (LP
BI
T
MAPFILEHEADER)new BYTE[sizeof(
BI
T
MAPFILEHEADER)]; memset(m_lpBmpFileHeader, 0, sizeof(
BI
T
MAPFILEHEADER)); // 读取
位图
文件头 int n
Count
=
dib
File.Read((void *)m_lpBmpFileHeader, sizeof(
BI
T
MAPFILEHEADER)); if(n
Count
!= sizeof(
BI
T
MAPFILEHEADER)) { return FALSE; } // 判断此文件是不是
位图
文件(“0x4d42”代表“BM”) if(m_lpBmpFileHeader->bfType == 0x4d42) { // 是
位图
文件 //AfxMessageBox("m_lpBmpFileHeader->bfType == 0x4d42"); // 计算除
位图
文件头的空间大小,分配空间并初始化为0 DWORD dw
Dib
Size =
dib
File.GetLength() - sizeof(
BI
T
MAPFILEHEADER); m_lp
Dib
= new BYTE[dw
Dib
Size]; //(LPBYTE) new BYTE[lHeight*lineBytes24] //m_lpOld
Dib
= new BYTE[dw
Dib
Size]; memset(m_lp
Dib
, 0, dw
Dib
Size); //memset(m_lpOld
Dib
, 0, dw
Dib
Size); // 读取除
位图
文件头的所有数据
dib
File.Read(m_lp
Dib
, dw
Dib
Size); //
dib
File.Read(m_lpOld
Dib
, dw
Dib
Size); // 关闭
位图
文件
dib
File.Close(); // 设置
位图
信息指针 m_lpBmpInfo = (LP
BI
T
MAPINFO)m_lp
Dib
; // 设置
位图
信息头指针 m_lpBmpInfoHeader = (LP
BI
T
MAPINFOHEADER)m_lp
Dib
; // 设置
位图
颜色表指针 m_lpRgbQuad = (LPRGBQUAD)(m_lp
Dib
+ 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_lp
Dib
+ m_lpBmpInfoHeader->
bi
Size + dwRgbQuadLength; m_lpData = m_lp
Dib
+ m_lpBmpInfoHeader->
bi
Size + dwRgbQuadLength; //m_lpOldData= m_lpOld
Dib
+ ((LP
BI
T
MAPINFOHEADER)m_lpOld
Dib
)->
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 C
Dib
::SaveToFile(LPCTSTR lpszPath) { // 以写模式打开文件 HDC hdc,hdcMem; H
BI
T
MAP h
Bi
t
Map = NULL; C
Bi
t
map *p
Bi
t
Map = NULL; CDC *pMemDC = NULL; BYTE *p
Bi
t
s; hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL); hdcMem = CreateCompatibleDC(hdc); h
Bi
t
Map = Create
DIB
Section(hdcMem,m_lpBmpInfo,
DIB
_PAL_COLORS,(void **)&p
Bi
t
s,NULL,0); p
Bi
t
Map = new C
Bi
t
map; p
Bi
t
Map->Attach(h
Bi
t
Map); pMemDC = new CDC; pMemDC->Attach(hdcMem); pMemDC->SelectObject(p
Bi
t
Map); pMemDC->SetBkMode(TRANSPARENT); //pMemDC->SetBkMode(OPAQUE); //添加自绘图形 m_myview->DrawLine(pMemDC); CFile
dib
File; if(!
dib
File.Open(lpszPath, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive)) { return FALSE; } // 记录
位图
文件名 strcpy(m_fileName, lpszPath); // 将文件头结构写进文件
dib
File.Write(m_lpBmpFileHeader, sizeof(
BI
T
MAPFILEHEADER)); // 将文件信息头结构写进文件
dib
File.Write(m_lpBmpInfoHeader, sizeof(
BI
T
MAPINFOHEADER)); // 计算颜色表长度 DWORD dwRgbQuadlength = CalcRgbQuadLength(); // 如果有颜色表的话,将颜色表写进文件 if(dwRgbQuadlength != 0) {
dib
File.Write(m_lpRgbQuad, dwRgbQuadlength); } // 将
位图
数据写进文件 DWORD dwDataSize = GetLineByte() * GetHeight();
dib
File.Write(m_lpData, dwDataSize); // 关闭文件
dib
File.Close(); return TRUE; } */ //======================================================= // 函数功能: 获取
位图
文件名 // 输入参数: 无 // 返回值: LPCTSTR-
位图
文件名 //======================================================= LPCTSTR C
Dib
::GetFileName() { return m_fileName; } //======================================================= // 函数功能: 获取
位图
宽度 // 输入参数: 无 // 返回值: LONG-
位图
宽度 //======================================================= LONG C
Dib
::GetWidth() { return m_lpBmpInfoHeader->
bi
Width; } //======================================================= // 函数功能: 获取
位图
高度 // 输入参数: 无 // 返回值: LONG-
位图
高度 //======================================================= LONG C
Dib
::GetHeight() { return m_lpBmpInfoHeader->
bi
Height; } //======================================================= // 函数功能: 获取
位图
的宽度和高度 // 输入参数: 无 // 返回值: CSize-
位图
的宽度和高度 //======================================================= CSize C
Dib
::GetDimension() { return CSize(GetWidth(), GetHeight()); } //======================================================= // 函数功能: 获取
位图
大小 // 输入参数: 无 // 返回值: DWORD-
位图
大小 //======================================================= DWORD C
Dib
::GetSize() { if(m_lpBmpInfoHeader->
bi
SizeImage != 0) { return m_lpBmpInfoHeader->
bi
SizeImage; } else { return GetWidth() * GetHeight(); } } //======================================================= // 函数功能: 获取单个像素所占位数 // 输入参数: 无 // 返回值: WORD-单个像素所占位数 //======================================================= WORD C
Dib
::Get
Bi
t
Count
() { return m_lpBmpInfoHeader->
bi
Bi
t
Count
; } //======================================================= // 函数功能: 获取每行像素所占字节数 // 输入参数: 无 // 返回值: UINT-每行像素所占字节数 //======================================================= UINT C
Dib
::GetLineByte() { return (GetWidth() * Get
Bi
t
Count
() /8 + 3) / 4 * 4; } //======================================================= // 函数功能: 获取
位图
颜色数 // 输入参数: 无 // 返回值: DWORD-
位图
颜色数 //======================================================= DWORD C
Dib
::GetNumOfColor() { UINT dwNumOfColor; if ((m_lpBmpInfoHeader->
bi
Clr
U
sed
== 0) && (m_lpBmpInfoHeader->
bi
Bi
t
Count
< 9)) { switch (m_lpBmpInfoHeader->
bi
Bi
t
Count
) { 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 C
Dib
::CalcRgbQuadLength() { DWORD dwNumOfColor = GetNumOfColor(); if(dwNumOfColor > 256) { dwNumOfColor = 0; } CString strColor; strColor.Format("dwNumOfColor:%d",dwNumOfColor); //AfxMessageBox(strColor); return dwNumOfColor * sizeof(RGBQUAD); } //======================================================= // 函数功能: 计算
位图
像素的起始位置 // 输入参数: 无 // 返回值: LPBYTE-
位图
像素的起始位置 //======================================================= LPBYTE C
Dib
::Get
Bi
t
s() { return (m_lp
Dib
+((LP
BI
T
MAPINFOHEADER)m_lp
Dib
)->
bi
Size+CalcRgbQuadLength()); } //======================================================= // 函数功能: 获取
位图
颜色表 // 输入参数: 无 // 返回值: LPRGBQUAD-
位图
颜色表指针 //======================================================= LPRGBQUAD C
Dib
::GetRgbQuad() { return m_lpRgbQuad; } //======================================================= // 函数功能: 获取
位图
数据 // 输入参数: 无 // 返回值: LPBYTE-
位图
数据指针 //======================================================= LPBYTE C
Dib
::GetData() { return m_lpData; } //======================================================= // 函数功能: 根据颜色表生成调色板 // 输入参数: 无 // 返回值: BOOL-TRUE 成功;FALSE 失败 //======================================================= BOOL C
Dib
::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 C
Dib
::Draw(CDC *pDC, CPoint origin, CSize size) { //
位图
无效,无法绘制,返回错误 if(!IsValid()) { return FALSE; } // 旧的调色板句柄 HPALETTE hOldPalette = NULL; // 如果
位图
指针为空,则返回FALSE if(m_lp
Dib
== NULL) { return FALSE; } // 如果
位图
有调色板,则选进设备环境中 if(m_hPalette != NULL) { hOldPalette = SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE); } // 设置
位图
伸缩模式 pDC->SetStretchBltMode(COLORONCOLOR); // 将
位图
在pDC所指向的设备上进行显示 StretchDI
Bi
t
s(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 C
Dib
::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
T
MAPINFOHEADER) + sizeof(RGBQUAD) * 256 + dwGradeBmpDataSize; // 设置灰度
位图
文件头 LP
BI
T
MAPFILEHEADER lpGradeBmpFileHeader = (LP
BI
T
MAPFILEHEADER)new BYTE[sizeof(
BI
T
MAPFILEHEADER)]; memset(lpGradeBmpFileHeader, 0, sizeof(
BI
T
MAPFILEHEADER)); lpGradeBmpFileHeader->bfType = 0x4d42; lpGradeBmpFileHeader->bfSize = sizeof(
BI
T
MAPFILEHEADER) + dwGradeBmpSize; lpGradeBmpFileHeader->bfOff
Bi
t
s = sizeof(
BI
T
MAPFILEHEADER) + sizeof(
BI
T
MAPINFOHEADER) + sizeof(RGBQUAD) * 256; lpGradeBmpFileHeader->bfReserved1 = 0; lpGradeBmpFileHeader->bfReserved2 = 0; // 为灰度
位图
分配空间,并初始化为0 LPBYTE lpGradeBmp = (LPBYTE)new BYTE[dwGradeBmpSize]; memset(lpGradeBmp, 0, dwGradeBmpSize); // 设置灰度
位图
信息头 LP
BI
T
MAPINFOHEADER lpGradeBmpInfoHeader = (LP
BI
T
MAPINFOHEADER)(lpGradeBmp); lpGradeBmpInfoHeader->
bi
Bi
t
Count
= 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
T
MAPINFOHEADER); 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
T
MAPINFOHEADER)); // 初始化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
T
MAPINFOHEADER) + 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_lp
Dib
= lpGradeBmp; m_lpBmpInfo = (LP
BI
T
MAPINFO)(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 C
Dib
::GraphToRgb() { //
位图
无效,失败返回 if(!IsValid()) { AfxMessageBox("该
位图
无效!"); return FALSE; } // 是压缩
位图
,失败返回 if(m_lpBmpInfoHeader->
bi
Compression !=
BI
_RGB) { return FALSE; } if(Get
Bi
t
Count
()==24) { AfxMessageBox("该
位图
已是24位,不用转换!"); return FALSE; } if(Get
Bi
t
Count
()!=8) { AfxMessageBox("该
位图
不是8位,不能转换,请用画图软件将其另存为成24
位图
!"); return FALSE; } // 如果不是24
位图
,才需要转换 // 获取原
位图
信息 LONG lHeight = GetHeight(); LONG lWidth = GetWidth(); UINT uLineByte = GetLineByte(); // 计算24
位图
数据所需空间 //return (GetWidth() * Get
Bi
t
Count
() /8 + 3) / 4 * 4; UINT uGradeBmpLineByte = (lWidth * 24/8 + 3) / 4 * 4; DWORD dwGradeBmpDataSize = uGradeBmpLineByte * lHeight; // 计算24
位图
所需空间 DWORD dwGradeBmpSize = sizeof(
BI
T
MAPINFOHEADER) + sizeof(RGBQUAD) * 0 + dwGradeBmpDataSize; // 设置24
位图
文件头 LP
BI
T
MAPFILEHEADER lpGradeBmpFileHeader = (LP
BI
T
MAPFILEHEADER)new BYTE[sizeof(
BI
T
MAPFILEHEADER)]; memset(lpGradeBmpFileHeader, 0, sizeof(
BI
T
MAPFILEHEADER)); lpGradeBmpFileHeader->bfType = 0x4d42; lpGradeBmpFileHeader->bfSize = sizeof(
BI
T
MAPFILEHEADER) + dwGradeBmpSize; lpGradeBmpFileHeader->bfOff
Bi
t
s = sizeof(
BI
T
MAPFILEHEADER) + sizeof(
BI
T
MAPINFOHEADER); lpGradeBmpFileHeader->bfReserved1 = 0; lpGradeBmpFileHeader->bfReserved2 = 0; // 为24
位图
分配空间,并初始化为0 LPBYTE lpGradeBmp = (LPBYTE)new BYTE[dwGradeBmpSize]; memset(lpGradeBmp, 0, dwGradeBmpSize); // 设置24
位图
信息头 LP
BI
T
MAPINFOHEADER lpGradeBmpInfoHeader = (LP
BI
T
MAPINFOHEADER)(lpGradeBmp); lpGradeBmpInfoHeader->
bi
Bi
t
Count
= 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
T
MAPINFOHEADER); lpGradeBmpInfoHeader->
bi
SizeImage = dwGradeBmpDataSize; lpGradeBmpInfoHeader->
bi
Width = lWidth; lpGradeBmpInfoHeader->
bi
XPelsPerMeter = 0; lpGradeBmpInfoHeader->
bi
YPelsPerMeter = 0; // 设置24
位图
颜色表 //LPRGBQUAD lpGradeBmpRgbQuad = (LPRGBQUAD)(lpGradeBmp + sizeof(
BI
T
MAPINFOHEADER)); // 初始化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
T
MAPINFOHEADER) + 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_lp
Dib
= lpGradeBmp; m_lpBmpInfo = (LP
BI
T
MAPINFO)(lpGradeBmp); m_lpBmpInfoHeader = lpGradeBmpInfoHeader; //m_lpRgbQuad = lpGradeBmpRgbQuad; m_lpData = lpGradeBmpData; // 设置颜色表标志 //m_bHasRgbQuad = TRUE; // 设置
位图
有效标志 m_bValid = TRUE; // 生成调色板 //MakePalette(); AfxMessageBox("转换成功,请保存24
位图
!"); return TRUE; } //======================================================= // 函数功能: 判断是否含有颜色表 // 输入参数: 无 // 返回值: 判断结果:TRUE-含有颜色表;FALSE-不含颜色表 //======================================================= BOOL C
Dib
::HasRgbQuad() { return m_bHasRgbQuad; } //======================================================= // 函数功能: 判断是否是灰度图 // 输入参数: 无 // 返回值: 判断结果:TRUE-是灰度图;FALSE-是彩色图 //======================================================= BOOL C
Dib
::IsGrade() { return (Get
Bi
t
Count
() < 9 && Get
Bi
t
Count
() > 0); } //======================================================= // 函数功能: 判断
位图
是否有效 // 输入参数: 无 // 返回值: 判断结果:TRUE-
位图
有效;FALSE-
位图
无效 //======================================================= BOOL C
Dib
::IsValid() { return m_bValid; } //======================================================= // 函数功能: 清理空间 // 输入参数: BOOL bFlag-TRUE 全部清空;FALSE 部分清空 // 返回值: 无 //======================================================= void C
Dib
::Empty(BOOL bFlag) { // 文件名清空 if(bFlag) { strcpy(m_fileName, ""); } // 释放
位图
文件头指针空间 if(m_lpBmpFileHeader != NULL) { delete [] m_lpBmpFileHeader; m_lpBmpFileHeader = NULL; } // 释放
位图
指针空间 if(m_lp
Dib
!= NULL) { delete [] m_lp
Dib
; m_lp
Dib
= 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 C
Dib
::
Count
Clr
(int r,int g,int b,int fanwei) { m_rgbsum=0; //
位图
无效,失败返回 if(!IsValid()) { AfxMessageBox("该
位图
无效!"); return FALSE; } if(Get
Bi
t
Count
()!=24) { CString str; str.Format("该
位图
是%d位,无法统计,请用画图软件将其另存为成24
位图
!",Get
Bi
t
Count
()); 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 C
Dib
::TranslationRight(long lXOffset,long lYOffset) { long i; long j; long lWidth,lHeight; lWidth=GetWidth(); lHeight=GetHeight(); //LPBYTE lpSrc
DIB
Bi
t
s; 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)
Dib::TranslationLeft(long lXOffset,long lYOffset) { long i; long j; long lWidth,lHeight; lWidth=GetWidth(); lHeight=GetHeight(); //LPBYTE lpSrc
DIB
Bi
t
s; long lLineBytes; lLineBytes=GetLineByte(); if (lXOffset<=0 || lYOffset<=0) { return FALSE; } for(i=0;i
DIB
位图
alpha通道
问题
前段时间研究三角函数在图像处理的应用,要实现的是一个三角函数方式的渐进透明度,但是实现中出现的一个
问题
非常不解,就是设置像素alpha通道没有效果的
问题
。 首先贴上代码 void OnPaint(HWND hWnd) { RECT rc; GetClientRect(hWnd, &rc); int width = 180; int
DIB
位图
(
Bi
t
map)的读取和保存
设备无关
位图
(Device Independent
Bi
t
map)是可以保存在磁盘的
位图
文件,可以从磁盘读取到内存或者从内存保存到磁盘上。它的文件结构是标准化的,可以在Windows/Linux/Unix等平台上显示相同的效果。本文主要介绍了 1. 如果将
位图
文件从磁盘读到内存中 2. 在内存中对
位图
文件进行操作后,如何将
位图
保存到磁盘1 读取
位图
到内存中1.1
DIB
文件结构要将
位图
文件(.b
BMP(
DIB
)图片格式
Windows中有两种
位图
格式,一种是GDI
位图
对象,另一种就是设备无关
位图
DIB
,扩展名为BMP。 文章内容一、BMP图片格式二、
DIB
位图
的内存表示三、 处理
DIB
位图
的重要API四、自己写的一个练手小项目 一、BMP图片格式 1、当
DIB
存储成文件时(即后缀为BMP的图片文件),它的格式如下图: 特别说明: 1位、4位、8位
位图
才有Color Table颜色表,像素位表示颜色表数组的索引 16位、24位、32位
位图
是没有Color Table的,像素位直接就是RGB数据 不过现在计算机中的
位图
几乎都
图形处理/算法
19,468
社区成员
50,700
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章