linux下将bmp图片的RGB数值打印到文件中,并另存。
2017-09-11 17:41
567 查看
前面我们可以获取到bmp文件头的信息,那么这里我们的思路就是根据获取到的文件头信息,将文件头中的各种变量赋值即可;例如我们获取时,得到height=600,那么我们在设置时,可以人为将其设置成height=600
条件:
1.用windows画图工具另存的一张BMP格式图片;
2.linux 或 ubuntu下vim编译器;
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fstream>
#include <iostream>
#pragma pack(2)
using namespace std;
typedef struct BITMAPFILEHEADER
{
u_int16_t bfType;
u_int32_t bfSize;
u_int16_t bfReserved1;
u_int16_t bfReserved2;
u_int32_t bfOffBits;
}BITMAPFILEHEADER;
typedef struct BITMAPINFOHEADER
{
u_int32_t biSize;
u_int32_t biWidth;
u_int32_t biHeight;
u_int16_t biPlanes;
u_int16_t biBitCount;
u_int32_t biCompression;
u_int32_t biSizeImage;
u_int32_t biXPelsPerMeter;
u_int32_t biYPelsPerMeter;
u_int32_t biClrUsed;
u_int32_t biClrImportant;
}BITMAPINFODEADER;
int biWidth; //图像宽
int biHeight; //图像高
int biBitCount; //图像类型,每像素位数
unsigned char *pBmpBuf; //存储图像数据
int lineByte; //图像数据每行字节数
条件:
1.用windows画图工具另存的一张BMP格式图片;
2.linux 或 ubuntu下vim编译器;
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <fstream>
#include <iostream>
#pragma pack(2)
using namespace std;
typedef struct BITMAPFILEHEADER
{
u_int16_t bfType;
u_int32_t bfSize;
u_int16_t bfReserved1;
u_int16_t bfReserved2;
u_int32_t bfOffBits;
}BITMAPFILEHEADER;
typedef struct BITMAPINFOHEADER
{
u_int32_t biSize;
u_int32_t biWidth;
u_int32_t biHeight;
u_int16_t biPlanes;
u_int16_t biBitCount;
u_int32_t biCompression;
u_int32_t biSizeImage;
u_int32_t biXPelsPerMeter;
u_int32_t biYPelsPerMeter;
u_int32_t biClrUsed;
u_int32_t biClrImportant;
}BITMAPINFODEADER;
int biWidth; //图像宽
int biHeight; //图像高
int biBitCount; //图像类型,每像素位数
unsigned char *pBmpBuf; //存储图像数据
int lineByte; //图像数据每行字节数
int readBmp(char *bmpName) { FILE *fp; if( (fp = fopen(bmpName,"rb")) == NULL) //以二进制的方式打开文件 { cout<<"The file "<<bmpName<<"was not opened"<<endl; return -1; } if(fseek(fp,sizeof(BITMAPFILEHEADER),SEEK_CUR)) //跳过BITMAPFILEHEADE { cout<<"跳转失败"<<endl; return -1; } BITMAPINFOHEADER infoHead; fread(&infoHead,sizeof(BITMAPINFOHEADER),1,fp); //从fp中读取BITMAPINFOHEADER信息到infoHead中,同时fp的指针移动 biWidth = infoHead.biWidth; biHeight = infoHead.biHeight; biBitCount = infoHead.biBitCount; lineByte = (biWidth*biBitCount/8+3)/4*4; //lineByte必须为4的倍数 //24位bmp没有颜色表,所以就直接到了实际的位图数据的起始位置 pBmpBuf = new unsigned char[lineByte * biHeight]; fread(pBmpBuf,sizeof(char),lineByte * biHeight,fp); fclose(fp); //关闭文件 return 0; }
int saveBmp(char *bmpName) { FILE *fp; if( (fp = fopen(bmpName,"wb") )== NULL) //以二进制写入方式打开 { cout<<"打开失败!"<<endl; return -1; } //设置BITMAPFILEHEADER参数 BITMAPFILEHEADER fileHead; fileHead.bfType = 0x4D42; fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lineByte * biHeight; fileHead.bfReserved1 = 0; fileHead.bfReserved2 = 0; fileHead.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); fwrite(&fileHead,sizeof(BITMAPFILEHEADER),1,fp); //设置BITMAPINFOHEADER参数 BITMAPINFOHEADER infoHead; infoHead.biSize = 40; infoHead.biWidth = biWidth; infoHead.biHeight = biHeight; infoHead.biPlanes = 1; infoHead.biBitCount = biBitCount; infoHead.biCompression = 0; infoHead.biSizeImage = lineByte * biHeight; infoHead.biXPelsPerMeter = 0; infoHead.biYPelsPerMeter = 0; infoHead.biClrUsed = 0; infoHead.biClrImportant = 0; //写入 fwrite(&infoHead,sizeof(BITMAPINFOHEADER),1,fp); fwrite(pBmpBuf,sizeof(char),lineByte * biHeight,fp); fclose(fp); //关闭文件 return 0; }
void work(char *openName,char* newName) { if(-1 == readBmp(openName)) cout<<"readfile error!"<<endl; //输出图像的信息 cout<<"Width = "<<biWidth<<" Height = "<<biHeight<<" biBitCount="<<biBitCount<<endl; ofstream outfile("imageData.txt",ios::in | ios::trunc); if(!outfile) { cout<<"open error"<<endl; return ; } int count = 0; //图像数据信息是从左下角按行开始存储的 for(int i = 0; i < biHeight; i++ ) { for(int j = 0; j < biWidth; j++ ) { for(int k = 0; k < 3; k++ ) { int temp = *(pBmpBuf + i * lineByte + j + k); count++; outfile<<temp<<" "; if(count % 8 == 0) { outfile<<endl; } } } } cout<<"总的像素数:"<<count / 3<<endl; saveBmp(newName); delete []pBmpBuf; return ; } int main(int argc,char *argv[]) { if(argc != 3) { printf("usage:%s picOpenName picNewName\n",argv[0]); return -1; } work(argv[1],argv[2]); return 0; }
相关文章推荐
- Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功
- Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功
- Linux 下V4l2摄像头采集图片,实现yuyv转RGB,RGB转BMP,RGB伸缩,jpeglib 库实现压缩RGB到内存中,JPEG经UDP发送功(转)
- RGB数据写bmp图片文件遇到的这些坑
- 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片的两个函数
- 把以下IP存入一个txt文件,编写程序把这些IP按数值大小,从小到达排序并打印出来。 61.54.231.245 61.54.231.9 61.54.231.246 61.54.231.48
- 怎样以少于1000行代码写一个视频播放器-将电影文件中的视频帧存储为BMP图片
- Linux framebuffer显示bmp图片
- linux下的access()函数判断文件是否存在、打印时间
- Linux 命令 - tail: 打印文件的结尾部分
- springMVC+ Linux + VSFTPD + nginx实现文件上传至图片服务器
- CBitmap程序中动态加载 本地文件上的BMP图片资源
- Linux - 打印文件夹全部文件 代码(C)
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- linux下的access()函数判断文件是否存在、打印时间
- linux使用join命令时切勿对文件进行数值排序
- YV12转RGB24的计算转换和bmp(dib)文件的显示保存
- PictureFilter——图像过滤类RGBImageFilter及图片文件读写类ImageIO的使用
- Linux打印文件目录结构
- VC6.0中使用Stream Object读取数据中流文件并显示Bmp,JPG等图片