资源简介
网上找了半天没找到,自己整理的 BMP 8位转24位
代码片段和文件信息
// ConvertBMP.cpp : 定义控制台应用程序的入口点。
//
#include “stdafx.h“
#include
#define WIDTHBYTES(bits) ((bits + 31)/32*4)
BOOL Convert8To24(RGBQUAD * pColorTable BYTE* srcImage BYTE* dstImage LONG imageWidthLONG imageHeight)
{
LONG lLineBytes24 = ((imageWidth*24+31)/32*4);
LONG lLineBytes8 = ((imageWidth*8+31)/32*4);
int i j n;
for(i = 0; i < imageHeight; i++)
{
for(j = 0 n = 0; j < lLineBytes8; j++)
{
int num = *(srcImage+lLineBytes8*i+j); // 获取8位中调色板信息的偏移量
*(dstImage+lLineBytes24*i+n) = pColorTable[num].rgbBlue;
n++;
*(dstImage+lLineBytes24*i+n) = pColorTable[num].rgbGreen;
n++;
*(dstImage+lLineBytes24*i+n) = pColorTable[num].rgbRed;
n++;
}
}
return true;
}
void ChangeBmpHeader(PBITMAPFILEHEADER pbfheader PBITMAPINFOHEADER pbiheader WORD wType)
{
pbiheader->biBitCount = wType; // 24 或者 8
pbiheader->biClrUsed = (wType == 24) ? 0 : 256;
pbiheader->biClrImportant = (wType == 24) ? 0 : 256;
pbfheader->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + pbiheader->biClrUsed * sizeof(RGBQUAD);
pbiheader->biSizeImage = WIDTHBYTES(pbiheader->biWidth * pbiheader->biBitCount) * pbiheader->biHeight;
pbfheader->bfSize = pbfheader->bfOffBits + pbiheader->biSizeImage;
}
int _tmain(int argc _TCHAR* argv[])
{
FILE* fpSrc = fopen(“1.bmp““rb+“);
if(fpSrc == NULL) return false;
// 读取BMP文件头信息
BITMAPFILEHEADER bf;
fread(&bf sizeof(BITMAPFILEHEADER) 1 fpSrc);
// 读取位图信息头
BITMAPINFOHEADER bi;
fread(&bi sizeof(BITMAPINFOHEADER) 1 fpSrc);
int bmpWidth = bi.biWidth;
int bmpHeight = bi.biHeight;
int biBitCount = bi.biBitCount;
RGBQUAD *pColorTable;
if(bi.biBitCount == 8) {
pColorTable=new RGBQUAD[256];
fread(pColorTable sizeof(RGBQUAD) 256 fpSrc);
}
else if(bi.biBitCount == 24){
fclose(fpSrc);
return;
}
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
unsigned char *pBmpBuf;
pBmpBuf = new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf 1 lineByte * bmpHeight fpSrc);
//fclose(fpSrc);
//----------------------------------------------------------------
//FILE* fpDes = fopen(“2.bmp““wb“);
//if(fpDes == NULL)
//{
// fclose(fpSrc);
// return FALSE;
//}
rewind(fpSrc);
ChangeBmpHeader(&bf &bi 24);
fwrite(&bf sizeof(BITMAPFILEHEADER) 1 fpSrc);
fwrite(&bi sizeof(BITMAPINFOHEADER) 1 fpSrc);
int lineByte24 = (bmpWidth * bi.biBitCount/8+3)/4*4;
unsigned char *dstImage;
dstImage = new unsigned char[lineByte24 * bmpHeight];
Convert8To24(pColorTable pBmpBuf dstImage bmpWidth bmpHeight);
fwrite(dstImage lineByte24 * bmpHeight 1 fpSrc);
delete [] pBmpBuf;
delete [] dstImage;
fclose(fpSrc);
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2798 2017-07-20 18:20 ConvertBMP\ConvertBMP.cpp
文件 4142 2017-07-12 18:42 ConvertBMP\ConvertBMP.vcxproj
文件 1314 2017-07-12 18:42 ConvertBMP\ConvertBMP.vcxproj.filters
文件 376 2017-07-12 19:00 ConvertBMP\ConvertBMP.vcxproj.user
文件 1574 2017-07-12 18:42 ConvertBMP\ReadMe.txt
文件 215 2017-07-12 18:42 ConvertBMP\stdafx.cpp
文件 233 2017-07-12 18:42 ConvertBMP\stdafx.h
文件 236 2017-07-12 18:42 ConvertBMP\targetver.h
目录 0 2017-07-20 18:19 ConvertBMP
----------- --------- ---------- ----- ----
10888 9
- 上一篇:软件工程专业实习报告
- 下一篇:百度地图api
相关资源
- 大地坐标与空间直角坐标互相转换
- 凌阳61板+AD7705转换+lcd1ocmjx8c显示
- 利用顺序栈将一个非负的十进制整数
- NFA到DFA的转换
- rgba8888转yuvsp420
- LAS与PCD、txt转换工具
- Win7资料转移工具绿色版
- 步进电机转速控制实验单片机汇编程
- 2018新版生意参谋转化指数还原真实转
- STM32F3使用ADC转换DMA模式传输数据
- 基于Qt的整数按位反转实现
- 用文件的方式把xyz的坐标值转换为N
- 基于bmp085气压传感器制作的大气压强
- 数字图像处理学习笔记转载
- 旋转编码器解码程序
- avr IAR 控制步进电机正反快慢转
- 两个proteus仿真6位数显频率计数器和
- 类运算符重载设计定义一个二维方阵
- wps2word_wps_转换_word
- ad和da转换芯片(TLC549/TLC5620)
- 群辉3617xs918+匹配正版SN和MAC支持转码
- 基于51单片机bmp180测气压温度实测可用
- STM32-ADC多通道转换
- 8位带符号二进制加法器verilog
- 坐标转换,地心地固转经纬高坐标系
- 拖动旋转缩放椭圆和矩形.rar
- h5自动旋转相册.zip
- 中缀表达式转后缀表达式并求值
- 前台js将table转为Excel表格
- 自动Dump核心转储文件.rar
评论
共有 条评论