TGA格式文件转化为YUV文件
因为之前分析的PNG格式文件数据有压缩,不太好提取数据,所以这一次尝试将TGA格式的文件转化为YUV格式的文件。
TGA文件的文件头中包括图片类型、图片的宽高数据、每像素占用的bit位数等数据,本次的转化程序只支持图片类型为2也就是无压缩无调色板数据的TGA文件,并且每像素占用的bit位数为24位。
程序的设计思路是:
1、先建立一个TGA文件的头文件结构体,用于读取头文件数据。
2、从头文件中获得图片长宽数据,因为只支持类型为2的文件,在无调色板无图像信息的情况下,数据的偏移量固定为18。
3、定好偏移量后,因为TGA文件的数据是从左下角读入,也就是图片的上下是颠倒的,读取RGB数据时需要将图片正向读入。
4、之前写过RGB2YUV的程序,因此在读入RGB数据后,可以直接调用转化为YUV图像。
程序如下:
头文件结构体函数:
#ifndef HEAD_DEFINE_H_INCLUDED
#define HEAD_DEFINE_H_INCLUDED
typedef struct{char IDlength = 0;char Colormaptype = 0;char Imagetypecode = 0;short Colormapoffset = 0;short Colormaplength = 0;char Colormapdepth = 0;short Xorigin = 0;short Yorigin = 0;short Width = 0;short Height = 0;char Bitsperpixel = 0;char Imagedescriptor = 0;
}Headfile;
void initialHeadfile(unsigned char* buffer, Headfile* H){H->IDlength = buffer[0];H->Colormaptype = buffer[1];H->Imagetypecode = buffer[2];H->Colormapoffset = (buffer[3]<<4) + buffer[4];H->Colormaplength = (buffer[5]<<4) + buffer[6];H->Colormapdepth = buffer[7];H->Xorigin = (buffer[8]<<4) + buffer[9];H->Yorigin = (buffer[10]<<4) + buffer[11];H->Width = (buffer[13]*256) + buffer[12];H->Height = (buffer[15]*256) + buffer[14];H->Bitsperpixel = buffer[16];H->Imagedescriptor = buffer[17];
}
#endif // HEAD_DEFINE_H_INCLUDED
RGB2YUV文件如下:
#ifndef RGB2YUV_H_INCLUDED
#define RGB2YUV_H_INCLUDED
#include"iostream"
#include"math.h"
#include"stdio.h"
#include"malloc.h"
using namespace std;
void transf(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* rgb, FILE* out, int W, int H){unsigned char* ybuffer = new unsigned char[W*H];unsigned char* ubuffer = new unsigned char[W*H/4];unsigned char* vbuffer = new unsigned char[W*H/4];unsigned char* u444buffer = new unsigned char[W*H];unsigned char* v444buffer = new unsigned char[W*H];int i;int j;int coun=0;for(i = 0; i < W*H; i++){b[i] = rgb[3*i];g[i] = rgb[3*i+1];r[i] = rgb[3*i+2];}for(i = 0; i < W*H; i++){ybuffer[i] = ((66*r[i] + 129*g[i] + 25*b[i]) >> 8) + 16;u444buffer[i] = ((-38*r[i] - 74*g[i] + 112*b[i]) >> 8) + 128;v444buffer[i] = ((112*r[i] - 94*g[i] - 18*b[i]) >> 8) + 128;}for (int i = 0; i < H; i += 2){for (int j = 0; j < W; j += 2){ubuffer[i/2*W/2 + j/2] = u444buffer[i * W + j];vbuffer[i/2*W/2 + j/2] = v444buffer[i * W + j];}}//for(i = 0; i < H; i++){// for(j = 0; j < W; j++){// ybuffer[i*W+j] = ((66*r[i*W+j] + 129*g[i*W+j] + 25*b[i*W+j]) >> 8) + 16;// if((!(i%2))&&(!(j%2))){// ubuffer[coun] = ((-38*r[coun] - 74*g[coun] + 112*b[coun]) >> 8) + 128;// vbuffer[coun] = ((112*r[coun] - 94*g[coun] - 18*b[coun]) >> 8) + 128;// coun++;// cout<<i<<" "<<j<<endl;// }// }//}fwrite(ybuffer, sizeof(unsigned char), W*H, out);fwrite(ubuffer, sizeof(unsigned char), W*H/4, out);fwrite(vbuffer, sizeof(unsigned char), W*H/4, out);cout<<"yuv file settled down"<<endl;delete ybuffer;delete ubuffer;delete vbuffer;
}
#endif // RGB2YUV_H_INCLUDED
这里有一个小疑问,被注释掉的代码是我之前的思路,但输出的图像的U和V数据似乎有问题,但并没有看出来哪里错了。
main函数如下:
#include"iostream"
#include"math.h"
#include"stdio.h"
#include"malloc.h"
#include"head_define.h"
#include"rgb2yuv.h"
using namespace std;
int main(int argc, char* argv[]){char* imgaddr = argv[1];char* outaddr = argv[2];FILE* TGAfile = fopen(imgaddr,"rb");FILE* YUVfile = fopen(outaddr,"w");int TGAfileSize;fseek(TGAfile, 0L, SEEK_END);TGAfileSize = ftell(TGAfile);rewind(TGAfile);cout<<"The tga space is "<<TGAfileSize<< endl; //输出tga文件大小int offset = 18;unsigned char* headbuffer = new unsigned char[offset];fread(headbuffer, sizeof(unsigned char), offset, TGAfile);Headfile Header;initialHeadfile(headbuffer, &Header); //初始化头文件if((Header.IDlength)!=0 ||(Header.Colormaptype)!=0 ||(Header.Imagetypecode)!=2 ||(Header.Bitsperpixel)!=24){cout<<"It is out of my ability"<<endl;return -1;}cout<<"The width of the image is "<<int(Header.Width)<<endl;cout<<"The Height of the image is "<<int(Header.Height)<<endl;int W = int(Header.Width);int H = int(Header.Height);unsigned char* rgbbuffer = new unsigned char[W*H*3];unsigned char* bbuffer = new unsigned char[W*H];unsigned char* gbuffer = new unsigned char[W*H];unsigned char* rbuffer = new unsigned char[W*H];unsigned char* tgabuffer = new unsigned char[TGAfileSize];fread(tgabuffer, sizeof(unsigned char), TGAfileSize, TGAfile);int i;int j;int a = 0;for(i = H-1; i >= 0; i--){for(j = 0; j < 3*W; j++){rgbbuffer[a] = tgabuffer[3*i*W + j];a++;}}//FILE* rgb = fopen("E:\\数据压缩奇怪的作业们\\作业3\\作业3\\2.rgb","w" );//fwrite(rgbbuffer, sizeof(unsigned char), 3*W*H, rgb);transf(rbuffer, gbuffer, bbuffer, rgbbuffer, YUVfile, W, H); //转化为yuv文件并输出delete tgabuffer;delete rgbbuffer;delete rbuffer;delete gbuffer;delete bbuffer;
}
原图是这样的:
最终输出出来的YUV文件为:
程序运行后结果如下:
TGA格式文件转化为YUV文件相关推荐
- 如何将Word文件转化为Latex文件:word-to-latex-2.56详解
首先推荐大家读一读这篇博文:教你如何在word中像LaTex那样打公式_ibingow的专栏-CSDN博客 Word转Latex软件word-to-latex 2.56破解版下载地址:百度网盘 请输入 ...
- java scel_使用java将搜狗词库.scel文件转化为.txt文件
需求:批量将.scel文件转化为可视的txt文件(支持1对1,多对1,多对多),并从中提取中文词(去重),支持追加内容. 成果: 使用: package com.hxl.files; import j ...
- python 把txt文件转化为pcd文件并用open3D可视化
python 把txt文件转化为pcd文件并用open3D进行可视化 最近在弄3D点云的一些东西,遇到一个问题:很多数据集给的点云数据都是txt格式的,但是在模型上用到的数据集基本是pcd格式!找了很 ...
- python快速将excel文件转化为txt文件
在进行数据预处理的时候,我们可能习惯于将用于存储数据的其他格式的文件转换为.txt文件,因为这类文件读取.写入和处理起来都比较高效.这篇博客主要介绍一种快速地将excel文件转化为.txt文件的方法, ...
- xps数据怎么导出为txt_WFP: 读取XPS文件或将word、txt文件转化为XPS文件
读取XPS格式文件或将doc,txt文件转化为XPS文件,效果图如下: 1.XAML页面代码: xmlns="http://schemas.microsoft.com/winfx/2006/ ...
- pdf文件转化为wmf文件_如何将PDF文件转换为PowerPoint
pdf文件转化为wmf文件 If you have a PDF file that you would like to convert to a PowerPoint presentation, yo ...
- 怎样将word文件转化为Latex文件:word-to-latex-2.56具体解释
首先推荐大家读一读这篇博文:http://blog.csdn.net/ibingow/article/details/8613556 --------------------------------- ...
- 如何把.ipynb文件转化为.py文件
第一种方法是: 在.ipynb 文件所在的目录下打开一个终端,然后输入: jupyter nbconvert --to script *.ipynb 就能把当前文件夹下面的所有的.ipynb文件转化为 ...
- Netlib文件转化为mps文件
Netlib文件转化为mps文件 下载地址 建立emps.c文件内容如下 /* Expand compressed LP programs (in netlib format) to MPS form ...
最新文章
- 对声音信标信号的采样频率
- 8253译码电路设计以及初始化编程讲解
- JfreeChart学习总结
- java工厂模式学习
- Java —— 正则表达式
- 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(5)签到题4题
- 授权其他数据库用户kill session
- 如何制作Linux程序启动脚本
- 计算机邮件合并应用测试怎么做,四大实例干货:word邮件合并功能步骤详解教程...
- 图片标注工具Labelme使用
- uni-app项目打包为app
- Eclipse快捷键自动生成返回对象
- 【obs】27:deps 构建说明及studio的vs2019构建及裁剪
- core java购买_Core Java =
- 【7gyy】cdma无线通讯上使用的技术
- 10G整数文件中寻找中位数
- 在50户人家的狗中寻找病狗数量的趣味题目(详细解释)
- 如何区分电脑上的硬件和软件?
- Excel解析工具easyexcel全面探索
- c++面试经验(可下载文档)
热门文章
- 爬取服务器public文件夹,数据采集任务——爬取四川大学公共管理学院主页新闻实验报告...
- 达梦数据库(DM8) windows安装教程
- 光伏“十三五”规划出炉:全新解析企业股市
- 单片机设计_实时时钟电路(AT89C51、LCD1602、DS1302)
- ADAMS 机构优化
- Latex常用宏包\usepackage
- 计算机辅助 高等数学教学,基于MATLABGUI的高等数学计算机辅助教学演示系统的开发-2019年精选文档.pdf...
- 哥几个最近的现状,酒后吐真言
- python下标是什么意思_python下标
- rabbitmq 安装问题