因为之前分析的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文件相关推荐

  1. 如何将Word文件转化为Latex文件:word-to-latex-2.56详解

    首先推荐大家读一读这篇博文:教你如何在word中像LaTex那样打公式_ibingow的专栏-CSDN博客 Word转Latex软件word-to-latex 2.56破解版下载地址:百度网盘 请输入 ...

  2. java scel_使用java将搜狗词库.scel文件转化为.txt文件

    需求:批量将.scel文件转化为可视的txt文件(支持1对1,多对1,多对多),并从中提取中文词(去重),支持追加内容. 成果: 使用: package com.hxl.files; import j ...

  3. python 把txt文件转化为pcd文件并用open3D可视化

    python 把txt文件转化为pcd文件并用open3D进行可视化 最近在弄3D点云的一些东西,遇到一个问题:很多数据集给的点云数据都是txt格式的,但是在模型上用到的数据集基本是pcd格式!找了很 ...

  4. python快速将excel文件转化为txt文件

    在进行数据预处理的时候,我们可能习惯于将用于存储数据的其他格式的文件转换为.txt文件,因为这类文件读取.写入和处理起来都比较高效.这篇博客主要介绍一种快速地将excel文件转化为.txt文件的方法, ...

  5. xps数据怎么导出为txt_WFP: 读取XPS文件或将word、txt文件转化为XPS文件

    读取XPS格式文件或将doc,txt文件转化为XPS文件,效果图如下: 1.XAML页面代码: xmlns="http://schemas.microsoft.com/winfx/2006/ ...

  6. pdf文件转化为wmf文件_如何将PDF文件转换为PowerPoint

    pdf文件转化为wmf文件 If you have a PDF file that you would like to convert to a PowerPoint presentation, yo ...

  7. 怎样将word文件转化为Latex文件:word-to-latex-2.56具体解释

    首先推荐大家读一读这篇博文:http://blog.csdn.net/ibingow/article/details/8613556 --------------------------------- ...

  8. 如何把.ipynb文件转化为.py文件

    第一种方法是: 在.ipynb 文件所在的目录下打开一个终端,然后输入: jupyter nbconvert --to script *.ipynb 就能把当前文件夹下面的所有的.ipynb文件转化为 ...

  9. Netlib文件转化为mps文件

    Netlib文件转化为mps文件 下载地址 建立emps.c文件内容如下 /* Expand compressed LP programs (in netlib format) to MPS form ...

最新文章

  1. 对声音信标信号的采样频率
  2. 8253译码电路设计以及初始化编程讲解
  3. JfreeChart学习总结
  4. java工厂模式学习
  5. Java —— 正则表达式
  6. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(5)签到题4题
  7. 授权其他数据库用户kill session
  8. 如何制作Linux程序启动脚本
  9. 计算机邮件合并应用测试怎么做,四大实例干货:word邮件合并功能步骤详解教程...
  10. 图片标注工具Labelme使用
  11. uni-app项目打包为app
  12. Eclipse快捷键自动生成返回对象
  13. 【obs】27:deps 构建说明及studio的vs2019构建及裁剪
  14. core java购买_Core Java =
  15. 【7gyy】cdma无线通讯上使用的技术
  16. 10G整数文件中寻找中位数
  17. 在50户人家的狗中寻找病狗数量的趣味题目(详细解释)
  18. 如何区分电脑上的硬件和软件?
  19. Excel解析工具easyexcel全面探索
  20. c++面试经验(可下载文档)

热门文章

  1. 爬取服务器public文件夹,数据采集任务——爬取四川大学公共管理学院主页新闻实验报告...
  2. 达梦数据库(DM8) windows安装教程
  3. 光伏“十三五”规划出炉:全新解析企业股市
  4. 单片机设计_实时时钟电路(AT89C51、LCD1602、DS1302)
  5. ADAMS 机构优化
  6. Latex常用宏包\usepackage
  7. 计算机辅助 高等数学教学,基于MATLABGUI的高等数学计算机辅助教学演示系统的开发-2019年精选文档.pdf...
  8. 哥几个最近的现状,酒后吐真言
  9. python下标是什么意思_python下标
  10. rabbitmq 安装问题