MFC下256色BMP位图的保存

news/2024/11/25 19:56:43/

一、BMP位图的文件格式

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

◆  位图文件头(bmp file header):  提供文件的格式、大小等信息
◆  位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
◆  调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
◆  位图数据(bitmap data):图像数据区
值得注意的是: BMP位图的调色板结构存在于单色、16色、256色位图结构中,256色以上(8位)以上的位图一般没有调色板结构

BMP图片文件格式表如下
数据名称所占存储大小
位图文件头14字节
位图信息头40字节
调色板4*(颜色数)
位图数据由具体图像决定

关于调色板结构
bmiCOLOR[]即调色板结构,由若干表项组成,每一个表项是一个 RGBQUAD类型的结构,一种颜色就由一个表项所决定,即调色板所占存储与颜色数有关
RGBQUAD类型的组成如下,总共占用4个字节,每一项各占一个字节
typedef tagRGBQUAD{
BYTE  rgbBlue;
BYTE  rgbGreen;
BYTE  rgbRed;
BYTE  rgbReseved;
}RGBQUAD

二、MFC下位图的保存

void CBMP_DemoView::OnFileSaveAs() 
{// TODO: Add your command handler code hereCBMP_DemoDoc* pDoc = GetDocument();//获取文档指针ASSERT_VALID(pDoc);if(pDoc->m_pDib == NULL){AfxMessageBox("Error!");return;}BITMAPFILEHEADER bmpf;//文件头BITMAPINFOHEADER bmpi;//信息头RGBQUAD rgb[256];//调色板数组int Widthbytes;CFile bmpFile;//文件CString strFileName;//文件名称
//	m_nCols = pbmi->bmiHeader.biWidth;
//	m_nRows = (long)(pbmi->bmiHeader.biHeight);
//row  行  height
//cols 列  widthint mcols = pDoc->m_pDib->m_nCols;int mrows = pDoc->m_pDib->m_nRows;PBITMAPINFO pbmpi=pDoc->m_pDib->pbmi;//引用调色板数据int bit_count=pDoc->m_pDib->m_nBitCounts;unsigned char* m_pData=NULL;m_pData = pDoc->m_pDib->pImgData;//文件名CFileDialog dlg(FALSE,"*.BMP",NULL,NULL,"位图文件(*.BMP)|*.bmp;*.BMP|");if(!dlg.DoModal()==IDC_SAVE)return;strFileName=dlg.GetPathName();if(bmpFile.Open(strFileName,CFile::modeCreate|CFile::modeReadWrite)==0)return;Widthbytes=(mcols*3+3)/4*4;//位图对齐,确保为4的倍数//头文件填写bmpf.bfType=0x4d42;bmpf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);bmpf.bfSize=bmpf.bfOffBits+Widthbytes*mrows;bmpf.bfReserved1=0;bmpf.bfReserved2=0;
//信息头填写bmpi.biSize=sizeof(BITMAPINFOHEADER);bmpi.biWidth=mcols;bmpi.biHeight=mrows;bmpi.biPlanes=1;bmpi.biBitCount=8;//8位bmpi.biCompression=0;bmpi.biSizeImage=0;bmpi.biXPelsPerMeter=0;bmpi.biYPelsPerMeter=0;bmpi.biClrUsed=0;bmpi.biClrImportant=0;
//颜色表填写for(int i=0;i<256;i++)
{rgb[i].rgbRed=pbmpi->bmiColors[i].rgbRed;rgb[i].rgbGreen=pbmpi->bmiColors[i].rgbGreen;rgb[i].rgbBlue=pbmpi->bmiColors[i].rgbBlue;
}//pDoc->m_pDib->Close();
//bmpFile.SeekToBegin();
bmpFile.Write(&bmpf,sizeof(bmpf));//写文件头
bmpFile.Write(&bmpi,sizeof(bmpi));//写信息头
bmpFile.Write(&rgb[0],(sizeof(RGBQUAD)*256));//写调色板
bmpFile.Write(m_pData,(mcols * mrows * bit_count /8));//写图像数据信息
bmpFile.Close();}




http://www.ppmy.cn/news/556361.html

相关文章

BMP图片格式详细解析--以256色为例还原256色BMP图像数据

256色bmp图像还原记录: 通过分析bmp图片的格式&#xff0c;可以完成BMP图片的打开和保存 一、bmp格式&#xff1a; 典型的 BMP 图像文件由四部分组成&#xff1a; 1 . 位图文件头数据结构 &#xff0c;它包含 BMP 图像文件的类型、显示内容等信息&#xff1b; 2 . 位图信息数据…

Python实现数字图像处理经典算法之256色转灰度图

算法介绍 256色转灰度图是数字图像处理经典算法中最简单的算法之一 1、彩色数字图像中的颜色有红、绿、蓝三种颜色混合而成&#xff0c;对应的像素颜色通道就是RGB&#xff08;R&#xff0c;G&#xff0c;B&#xff09;&#xff0c;R、G、B数值共有256个数值&#xff0c;也称…

计算机论文图片大小,对一副大小为256*256的bmp格式256色的灰度图象进行霍夫曼和字典编码压缩处理...

内容简介: 课程设计 对一副大小为256*256的bmp格式256色的灰度图象进行霍夫曼和字典编码压缩处理,共31页,6992字 目录 绪论1 1原理分析2 1.1数字图象2 1.1.1灰度图象2 1.1.2灰度直方图3 1.2霍夫曼(Huffman)编码5 1.2.1截断霍夫曼编码5 1.2.2自适应霍夫曼编码7 1.3LZW编码原理…

用PS制作256色的BMP图片

1.打开PS&#xff0c;新建文件&#xff0c;颜色模式为RGB&#xff0c;位数为8位&#xff0c;大小为640X480像素&#xff0c;其它默认 2.文件->打开&#xff0c;选中素材图片 3.将素材图片放到新建的图层上 4.打开文件菜单&#xff0c;存储为WEB和设备所用格式&#xff0c;设…

真彩色转256色算法

位图常用的一种压缩方法。从位图图片中选择最有代表性的若干种颜色&#xff08;通常不超过256种&#xff09;编制成颜色表&#xff0c;然后将图片中原有颜色用颜色表的索引来表示。 这样原图片可以被大幅度有损压缩。适合于压缩网页图形等颜色数较少的图形&#xff0c;不适合压…

计算机颜色格式(真彩、256色等)

原文链接&#xff1a;https://www.cnblogs.com/jackStudy/archive/2012/06/26/2563261.html 常见的颜色有 8位 16位 24位 32位色&#xff0c;其中24位及以上称为真彩&#xff0c;是PC上最常用的颜色&#xff0c;其他基本用于嵌入式系统或一些工控领域&#xff0c;详情可查阅一…

RGB转8色16色256色

RGB色的图片有255*255*25516581375种颜色&#xff0c;如果再加上透明度ARGB就要再乘以255&#xff0c;这么多的颜色在图形处理中有时不需要使用那么多的颜色&#xff0c;只需要转化成8色、16色或者256色就可以了&#xff0c;而透明度则作特殊处理&#xff0c;比如在阀值80以下的…

matlab 256灰度图像,MATLAB实现256色灰度图像的Arnold置乱

MATLAB实现256色灰度图像的Arnold置乱 下面的程序实现256色灰度图像的Arnold置乱。以前用VC做很麻烦&#xff0c;但在matlab中却显得非常简洁。matlab不愧是一款很受欢迎的辅助研究工具。 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0…