24位BMP转8位BMP

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

// 24bit28bit.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "24bit28bit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

 


#include<stdio.h>

#include <afx.h>

#include <windows.h>
BYTE* ConvertTo8Bit(CString strFileName, DWORD *dwFileLength, BYTE *lpNewBmpData) ;
BOOL SaveFile(CString strFileName, DWORD dwFileLength);

BITMAPINFO* lpNewBmpInfo = NULL;  //新8位位图信息头首指针
BYTE *lpOldBmp = NULL;      //指向原来24位位图信息头
BYTE*lpNewBmpData = NULL;  //指向新的8位位图的信息头指针


void main()
{
 char strOpenFileName[200], strSaveFileName[200];
 printf("请输入一幅24位位图的路径!/n");
 gets(  strOpenFileName );
 printf("请输入你要保存转换后的8位位图的路径!/n");
 gets( strSaveFileName );
 
 DWORD dwFileLength;
 lpNewBmpInfo = (BITMAPINFO*)ConvertTo8Bit( strOpenFileName, &dwFileLength, lpNewBmpData);
 if( !lpNewBmpInfo )
 {
  printf( "转换出错,程序退出!/n");
  return ;
 }
 if( !SaveFile( strSaveFileName, dwFileLength) )
 {
  printf( "保存文件出错!" );
  return ;
 }
 
 if( lpNewBmpData != NULL)
  delete []lpNewBmpData;
 if( lpNewBmpInfo != NULL )
  delete []lpNewBmpInfo;
 if( lpOldBmp != NULL )
  delete []lpOldBmp;
}


/*************************************************************************
*   功能: 将24位位图转换为8位位图

  *   参数: strFileName:    (in)24位位图文件所在路径      
  lpNewBmpData:   (out)做为8位位图的实际数据的指针
  *dwFileLength:  (out)为原24位位图图像文件长度(从文件信息头开始,不含文件头的14个字节)
 
 *   返回: 8位位图的信息头指针
 
************************************************************************/
BYTE* ConvertTo8Bit(CString strFileName, DWORD *dwFileLength, BYTE *lpNewBmpData)
{
 
 if( lpNewBmpData != NULL )
 {
  delete []lpNewBmpData;
  lpNewBmpData = NULL;
 }
 
 //创建文件句柄
 HANDLE hFile = ::CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,
  NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(hFile == 0)
 {
  printf("不能打开文件,请重新选择!/n");
  return NULL;
 }
 
 //读取图像文件
 DWORD dwWriteNum;  
 BITMAPFILEHEADER Bmp_file_head; //文件头
 ReadFile(hFile,&Bmp_file_head,14,&dwWriteNum,NULL);//读取文件头,共14个字节
 if((Bmp_file_head.bfType != 'MB')||(dwWriteNum != sizeof(BITMAPFILEHEADER)))
 {
  printf("不是BMP位图文件或数据有误!/n");
  return NULL;
 }    
 *dwFileLength = GetFileSize(hFile,NULL)-sizeof(BITMAPFILEHEADER);  //获取文件的长度
 
 
 lpOldBmp= new BYTE[ *dwFileLength];   //存放原24位位图像,包括图像的信息头、调色板和像素数据
 ReadFile(hFile,lpOldBmp,*dwFileLength,&dwWriteNum,NULL);       //读取图像数据
 
 
 BYTE*lpOldBmpData = lpOldBmp + sizeof(BITMAPINFOHEADER) ;      //指向图像数据的实际位置,其调色板为0
 BITMAPINFO*lpOldBmpInfo = (BITMAPINFO*)lpOldBmp;
 
 if( lpOldBmpInfo->bmiHeader.biBitCount != 24)
 {
  printf( "此图像非24位位图!");
  return NULL;
 }
 
 int   nScanWidth;      //转换后其每行扫描宽度
 int  nLineWidth;      //将其转换成8位位图后每行宽度(即每行字节数)  
 int   nSrcWidth,nSrcHeight;  
 
 nSrcHeight=lpOldBmpInfo->bmiHeader.biHeight;    //原24位位图高度
 nSrcWidth=lpOldBmpInfo->bmiHeader.biWidth;      //原24位位图宽度
 
 nLineWidth = nSrcWidth*3/4*4;   
 if(nLineWidth<nSrcWidth*3)  
  nLineWidth=nLineWidth+4;                //保证以DWORD对齐(为4的整数倍)
 
 nScanWidth=nSrcWidth/4*4;  
 if(nScanWidth<nSrcWidth)  
  nScanWidth=nScanWidth+4;                //保证以DWORD对齐(为4的整数倍)
 
 //申请位图的空间
 //  int nDataLen = nScanWidth*nSrcHeight+2;  
 //  lpNewBmpInfo=(BITMAPINFO*)new BYTE[*dwFileLength]; 
 //  lpNewBmpData=new BYTE[nDataLen];
 *dwFileLength = sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD) + nScanWidth*nSrcHeight+2;   //Save 的时候要使用
 lpNewBmpInfo=(BITMAPINFO *)new BYTE[*dwFileLength];
 
 
 //设置新的位图为8位位图,并设置其相应宽度与高度
 lpNewBmpInfo->bmiHeader=lpOldBmpInfo->bmiHeader;  
 lpNewBmpInfo->bmiHeader.biBitCount=8;  
 
 //数据起始位置为原位图信息头起始+位图信息头大小+彩色表大小
 //lpNewBmpData  = (BYTE*)(lpNewBmpInfo + sizeof(BITMAPINFOHEADER)/* + 256* sizeof(RGBQUAD)*/); 
 lpNewBmpData  = (BYTE*)lpNewBmpInfo + sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD);
 //指向图像数据的实际位置, 主要问题是在这里吧,看了BMP的结构...是应该加上256* sizeof(RGBQUAD)这个吧,还是不行..
 
 int   i,j;  
 //为其相应的彩色表赋值
 for(i=0;i<256;i++)  
 {  
  lpNewBmpInfo->bmiColors[i].rgbRed=i;  
  lpNewBmpInfo->bmiColors[i].rgbGreen=i;  
  lpNewBmpInfo->bmiColors[i].rgbBlue=i;  
  lpNewBmpInfo->bmiColors[i].rgbReserved=0;  
 }  
 
 //按转换公式将其进行转换
 for(i=0;i<nSrcHeight;i++)  
 {
  for(j=0;j<nSrcWidth;j++)  
  {  
   BYTE   color[3];  
   DWORD   dwColorTemp;  
   for(int   s=0; s<3; s++)  
    color[s]=lpOldBmpData[i*nLineWidth+j*3+s];  
   
   dwColorTemp=int(color[2]*0.299+color[1]*0.587+color[0]*0.114);  
   
   if(dwColorTemp>255)  
    dwColorTemp=255; 
   if( dwColorTemp< 0 )
    dwColorTemp = 0;
   
   lpNewBmpData[i*nScanWidth+j]=(unsigned char)dwColorTemp;  
  }  
 }
 lpNewBmpData[nScanWidth*nSrcHeight]=0;  
 lpNewBmpData[nScanWidth*nSrcHeight+1]=0;
 
 if( !CloseHandle( hFile ) )
  printf("关闭文件时失败");
 
 
 return (BYTE*)lpNewBmpInfo;
 
}

//传进文件名与文件长度,创建8位位图文件
BOOL SaveFile(CString strFileName, DWORD dwFileLength)
{
 HANDLE hSaveFile = CreateFile( strFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
  NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 if( !hSaveFile )
 {
  printf( "创建文件出错/n");
  return FALSE;
 }
 
 //
 DWORD dwWriteNum;
 BITMAPFILEHEADER BFH;
 BFH.bfType = 'MB';
 BFH.bfSize = dwFileLength + sizeof(BITMAPFILEHEADER);
 BFH.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 256* sizeof(RGBQUAD); //256为调色表颜色数(0-255),这里没错吧
 BFH.bfReserved1 = BFH.bfReserved2 = 0;
 
 //写位图头信息
 WriteFile( hSaveFile, &BFH, sizeof(BITMAPFILEHEADER), &dwWriteNum, NULL);
 
 //写实际数据
 WriteFile( hSaveFile, lpNewBmpInfo, dwFileLength, &dwWriteNum, NULL);
 CloseHandle( hSaveFile );
 return TRUE;
 
}

 

 

24真彩色bmp图片8256色带调色板的bmp 程序由C语言实现,调用了windows的库<WINGDI.h>,在windows10+VS2019环境下执行成功。 /* 作者:hglijiahao 本程序只支持24真彩色bmp图片8256色带调色板的bmpbmp文件结构参考https://www.cnblogs.com/kingmoon/archive/2011/04/18/2020097.html 思路:修改图起始偏移量、图像色深,创建调色板,便利图数据,将RGB化为灰度 值并化为灰度的调色板索引值(8色深调色板有2 阅读详情

相关推荐

实验4.1python实现BMP文件824

文章目录BMP图像文件格式BMP文件简介BMP文件组成结构BMP文件字节序实验内容实验步骤导入库打开BMP文件并获取文件的基本信息读取调色版获得BMP文件字节序生成图片并换为BMP24将5幅图片全部24BMP格式总结 BMP图像文件格式 BMP文件简介 BMP(全称 Bitmap)是 Windows 操作系统中的标准图像文件格式,可以分成两类:设备相关图(DDB)和设备无关图(DIB),使用广泛。它采用映射存储格式,除了图像深度可选以外,在绝大多数应用中不采用其他任何压缩,因此,BMP 文件

远离起点的博客 1735

bmp248

bmp248,绝对可用,图片路径D:\a0.bmp

bmp24彩色图像8灰度图像(纯C++)

  自从上一次写了bmp文件格式分析,后来是准备马上就写程序了,谁知后来就忘了,昨天突然想起来就将其写了出来。   程序的功能是将彩色图灰度图,中间彩色和灰度的文件header都用到了,程序的流程我想我写的还是比较清楚的。没有用到Windows下的某些函数,在Linux下应该也能运行。 #include &lt;iostream&gt; #include &lt;fstream&gt;...

weixin_34049948的博客 1871

BMP图片读写,24输入换成8输出,完整C代码,运行成功

24彩色bmp图片读入,换成8灰度图像输出

24bmp文件换为8bmp文件

深(Bit Depth)是衡量数字图像中每个像素可以表示的颜色数量的一个指标。深越高,每个像素可以表示的颜色就越丰富,图像的细节和质量也就越高。常见的深为8、1624和32。​由于dsp上的限制,在RTOS上只能显示8深的bmp,所以需要将24深的bmp8深的bmp

daocaoren94的博客 2677

bmp格式 8bit与24bit深度相互

bmp格式 8bit与24bit相互换 一、实验要求 在图像处理软件中生成8bit和24bit深度的BMP文件,编写程序实现不同像素深度文件的相互换。重点掌握函数定义、缓存区分配、倒序读写、结构体操作。 二、算法原理 1. 8bit24bit 8bitBMP图像文件包括4部分: 图文件头fileheader typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD

weixin_45824717的博客 4323

c++将24bmp8bmp灰度, 8bmp灰度反色,243张8bmp灰度图

c++ bitmap

richer_live的博客 876

2 4 8BMP24BMP(代码)

//#include "stdafx.h" #include #define WIDTHBYTE(bit) (( ( (bit)+31)/32 )*4) #define _BITS_PER_PIXEL_24 24 BOOL ConvertBmp4ToBmp24(const char* pSrcFile,const char* pDesFile) { FILE* fpSrc = f

Cesar Wu 1543

BMP讲解,调色板讲解,纯C语言读写24BMP文件,32BMP24BMP,读写8BMP

杂叙: 最近在做嵌入式视觉工作,故不可以用opencv库,只好自己写,做视觉第一点便是读取图片,于是学习了bmpbyte map picture)的读写,发现这是一个小坑,首先不知道怎么得到bmp图片,这里推荐网站:换网站 正文: 1.bmp文件概述: bmp图片有32,24,16,8,1,bmp文件之分,一般由header字段(54字节),调色板字段(1bmp有2*4字节,8b...

爱安敝之的博客 2814

24bmp8bmp图方法,不失真

24bmp8bmp图方法,不失真

C#的bitMap类.bmp图像 824248

基于winfrom平台 使用了button和pictureBox和comboBox等控件完成 代码如下:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System

ANDY 8474

图像深度换陷阱:PNG 32JPG 24BMP 18的3个常见数据损失案例

本文深入探讨图像深度换中的常见数据损失问题,重点分析PNG 32JPG 24导致的透明度丢失、BMP 18灰度图的二值信息退化等典型场景。通过代码示例和对比表格,提供深度换的实用解决方案和优化建议,帮助开发者避免图像处理中的常见陷阱。

weixin_29062823的博客 312

实现1,4,8,24BMP图的互相换的方法,3224

from: http://blog.sina.com.cn/s/blog_61e61df60100igzb.html BOOL SaveTrueBmp(HBITMAP hBitmap, CString FileName) { //设备描述表 HDC hDC; //真彩色图中每象素所占字节数为24 WORD wBitCount=24; //定义调色板大小, 图中像素字节大小 ,

lys07962000的专栏 3万+

linux 如何将3224,实现1,4,8,24BMP图的互相换的方法,3224...

from:BOOL SaveTrueBmp(HBITMAP hBitmap, CString FileName){//设备描述表HDC hDC;//真彩色图中每象素所占字节数为24WORD wBitCount=24;//定义调色板大小, 图中像素字节大小 ,图文件大小 , 写入文件字节数DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, d...

weixin_28934777的博客 908

c语言32bmp存储,C语言读取8 16 24 32 BMP图文件 32  游戏编程初学...

// 监测是否图文件if (Bmp.bitmapfileheader.bfType!=BITMAP_ID)//检查是否为MB文件{// close the filefclose(fpBmp);// return errorreturn(NULL); //如果不是则直接返回,不做处理} // end if// 继续读取文件并保存到 bitmapinfoheader中fread(&Bmp...

weixin_39933484的博客 1166

bmp图文件:读取、写入、24真彩8灰度、灰度图的二值化

 1、 图像的二值化的基本原理图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值

帽子Lee的专栏 7065

SYD_Calculator技巧三[WAV文件16SBit_8Khz8Bit_8Khz][32PNG图片24RGB(BMP)][QQ空间新增图片提取][提取特殊字符间的内容]

SYD_Calculator技巧三[WAV文件16SBit_8Khz8Bit_8Khz]

挖到尽头 2001
上一篇: 调用Xvid编码器流程(基于xvid1.1.0)
下一篇: 视频会议JB抖动缓冲设计
threewells_14
博客等级 码龄20年 28粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值