用C++代码将像素矩阵保存为图片,这里以读取yuv序列视频帧为例进行分析,假设4:2:0yuv序列有300帧,则首先需要将每一视频帧保存在一个像素矩阵中,然后将每一个矩阵保存为图片,最终会有300个bmp图片。

纯C++代码如下:

saveToPicture.cpp

#include<iostream>
#include<string>
using namespace std;#define FrameSize 176*144  //视频帧大小
#define FrameNum 300       //yuv帧数
#define ET_SIZE 300
char errorText[ET_SIZE];void errorMsg(const char *msg) {printf("error:%s\n", msg);
#ifdef _WIN32system("pause");
#endifexit(-1);
}void readSequence(char *fileName, unsigned char **frames) {FILE *fp = fopen(fileName, "rb");if (fp == NULL) {sprintf(errorText, "File %s doesn't exist\n", fileName);errorMsg(errorText);}int uvSize = FrameSize / 2;            //H.264编解码获得的关键帧都是彩色序列,这里主要是提取亮度分量Y。unsigned char *buf = (unsigned char *)malloc(sizeof(unsigned char) * uvSize);for (int i = 0; i < FrameNum; i++) {//read yif (fread(frames[i], 1, FrameSize, fp) != FrameSize) {  //每一个keyFrames[i]分配的是 (unsigned char) * FrameSize的大小,所以fread要读的每个数据项的字节数为1,可以表示每个像素点亮度范围0~255sprintf(errorText, "Input sequence %s is not enough", fileName);errorMsg(errorText);}//read u,vfread(buf, 1, uvSize, fp);}free(buf);fclose(fp);
}void write_bmpheader(unsigned char *bitmap, int offset, int bytes, int value) {int i;for (i = 0; i < bytes; i++)bitmap[offset + i] = (value >> (i << 3)) & 0xFF;
}unsigned char *convertToBmp(unsigned char *inputImg, int width, int height, int *ouputSize) {/*create a bmp format file*/int bitmap_x = (int)ceil((double)width * 3 / 4) * 4;unsigned char *bitmap = (unsigned char*)malloc(sizeof(unsigned char)*height*bitmap_x + 54);bitmap[0] = 'B';bitmap[1] = 'M';write_bmpheader(bitmap, 2, 4, height*bitmap_x + 54); //whole file sizewrite_bmpheader(bitmap, 0xA, 4, 54); //offset before bitmap raw datawrite_bmpheader(bitmap, 0xE, 4, 40); //length of bitmap info headerwrite_bmpheader(bitmap, 0x12, 4, width); //widthwrite_bmpheader(bitmap, 0x16, 4, height); //heightwrite_bmpheader(bitmap, 0x1A, 2, 1);write_bmpheader(bitmap, 0x1C, 2, 24); //bit per pixelwrite_bmpheader(bitmap, 0x1E, 4, 0); //compressionwrite_bmpheader(bitmap, 0x22, 4, height*bitmap_x); //size of bitmap raw datafor (int i = 0x26; i < 0x36; i++)bitmap[i] = 0;int k = 54;for (int i = height - 1; i >= 0; i--) {int j;for (j = 0; j < width; j++) {int index = i*width + j;for (int l = 0; l < 3; l++)bitmap[k++] = inputImg[index];}j *= 3;while (j < bitmap_x) {bitmap[k++] = 0;j++;}}*ouputSize = k;return bitmap;
}void saveToBmp(unsigned char *inputImg, int width, int height, char *outputFileName) {int size;unsigned char *bmp = convertToBmp(inputImg, width, height, &size);FILE *fp = fopen(outputFileName, "wb+");if (fp == NULL) {sprintf(errorText, "Could not open file: %s", outputFileName);errorMsg(errorText);}fwrite(bmp, 1, size, fp);fclose(fp);free(bmp);
}int main() {int width = 176, height = 144;unsigned char **oriFrames;oriFrames = (unsigned char**)malloc(sizeof(unsigned char*) * FrameNum);for (int i = 0; i < FrameNum; i++) {oriFrames[i] = (unsigned char*)malloc(sizeof(unsigned char) * FrameSize);}readSequence("foreman_qcif_300.yuv", oriFrames);char imgName[30];for (int i = 0; i < FrameNum; i++) {sprintf(imgName,"./picture/ReconsFrame%d.bmp", i);//矩阵oriFrames[i]可以是任何你想保存为图片的像素矩阵,这里是yuv视频图像每一帧的像素数据saveToBmp(oriFrames[i], width, height, imgName);  }
}

纯C++代码实现将像素矩阵保存为bmp图片相关推荐

  1. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...

  2. RGB数据保存为BMP图片

    一.BMP文件由文件头.位图信息头.颜色信息和图形数据四部分组成 1.BMP文件头(14字节) [cpp] view plain copytypedef struct /**** BMP file h ...

  3. 基于opencv视觉库,通过numpy进行像素矩阵处理,压缩图片、做像素图

    1. numpy库基本介绍 NumPy 是一个Python包(Numeric Python)它是一个由多维数组对象和用于处理数组的例程集合组成的库,其支持大量高维度数组与矩阵运算.NumPy 也针对数 ...

  4. opengl将bmp读成像素_在 opengl 环境下将 texture 保存为 bmp 图片

    首先说一下做这个功能的原因,是在应用里,有一个渲染线程,负责渲染出图,将最终的画面以texture形式传递给另一个线程,后者会再进行一些处理,然后渲染到屏幕上.那么在最后显示出来画面偶尔有花屏撕裂的现 ...

  5. python画图保存png图片_Python将numpy矩阵保存为PNG图片

    我通过PIL和numpy处理的图片现在是一个numpy array,我希望它存回png格式,于是查到了scipy.misc.toimage可以做到,但是这里面有一些需要注意的地方. 直接上我的code ...

  6. python矩阵变成图片_Python将numpy矩阵保存为PNG图片

    我通过PIL和numpy处理的图片现在是一个numpy array,我希望它存回png格式,于是查到了scipy.misc.toimage可以做到,但是这里面有一些需要注意的地方. 直接上我的code ...

  7. MFC 将CDC绘图保存为bmp图片

    #include "stdafx.h" #include <windows.h> #include <atlimage.h>int __stdcall Wi ...

  8. JPG、RGB、YUV像素数据保存成JPG、BMP图片

    本文章使用的摄像头是OV2640,可以直接输出JPG格式的图片,摄像头不多说,开发板是ESP32-CAM,串口输出数据给上位机,C#写的,VS2017. 1.JPG数据图片显示和保存 JPG格式的图片 ...

  9. framebuffer 保存 bmp图片格式

    最近需要完成一个从framebuffer中进行读取,然后将内存的东西保存为bmp图片格式,我的其他博客内容对framebuffer进行详细的讲解,以及bmp的格式进行详细的讲解. 之前从网上看到了一些 ...

最新文章

  1. python怎么打开交互式窗口-使用pycharm进行交互式shell调试
  2. OCR识别-python版(一)
  3. sed命令详解--转
  4. 给CenOS7虚拟机扩容
  5. MAC地址如何在windows与unix下查看?
  6. [Leedcode][JAVA][第5题][最长回文子串][数组][动态规划]
  7. 它打败了欧几里得空间,踹飞了数学怪物,成为全世界的焦点
  8. java数据段 静态区_回顾一下基础,关于栈与堆,常量池,静态区
  9. WPF入门教程系列(一) 创建你的第一个WPF项目
  10. pytorch教程:Flatten类实现的模版
  11. 开源人工智能技术将改变一切
  12. 静态路由协议的默认管理距离是_动态路由选择原理(距离矢量路由协议RIP)
  13. matlab画图点形状,matlab画图点的形状
  14. vc运行库各版本下载
  15. 微信支付app支付怎么快速开通
  16. 一个开源知识管理系统,满足企业定制化需求
  17. 推荐8款免费企业邮箱,让你的工作便捷起来
  18. 网站前端联系我们之点击自动打开qq/Tim对话窗口
  19. PS怎样把成图变成素描或者速写稿
  20. zcmu 1919: kirito's 星爆气流斩

热门文章

  1. windows加域后的问题
  2. 02205微型计算机原理与接口技术自考,2012年微型计算机原理与接口技术自考题模拟(2)...
  3. bootstrap checkbox_[推荐]icheck-bootstrap(漂亮的ckeckbox/radiobox)
  4. java placeholder_Java占位符
  5. 交换机工作原理_交换机你了解它吗?它工作原理是这样的
  6. java 字符串操作_Java 字符与字符串
  7. 深度学习入门——波士顿房价预测
  8. 多分辨率下的彩色图像分割方法
  9. php简介及其发展,PHP 简介
  10. 5-functools模块