一、tga文件格式基本信息
tga(Truevision Graphics Adapter)文件格式,tga文件格式可用于存储8位、15位、16位、24位、32位图像数据,支持alpha通道、颜色索引、RGB颜色、灰度图、行程压缩算(RLE)、开发者自定义区、缩略图等;

tga文件格式因其格式简单、易于实现、没有专利费用和跨平台等特性而被图形图像工业广泛使用;

tga文件格式在兼顾了BMP的图象质量的同时又兼顾了JPEG的体积优势。并且还有自身的特点:通道效果、方向性。在CG领域常作为影视动画的序列输出格式,因为兼具体积小和效果清晰的特点;

tga的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有很大影响,是计算机生成图像向电视转换的一种首选格式。tga图像格式最大的特点是可以做出不规则形状的图形、图像文件;

tga格式支持压缩,使用不失真的压缩算法。

二、tga文件存储格式相关信息:
以小端模式存储的,包括规格定义和RGB数据,也就是BGR形式存放;

tga头文件记录了调色板偏移大小和规格,和图像像素数据的偏移大小和规格;

tga分为压缩编码的和非压缩编码的,压缩算法是采用了RLE算法。

三、实验内容
限于自身能力,暂且尝试无压缩真彩图像形式的tga格式文件向yuv格式文件转化的c++编程实现。
在此条件下,考虑的文件头为
之后为图像信息字段、颜色表数据(此情况不存在)、图像数据(bbb…ggg…rrr…储存)

编程思路:
1定义文件头结构体
2打开、读取文件文件头相关信息,找到图像数据位置
3读入rgb数据
4rgb转yuv
5生成yuv文件

代码:
主函数

#include<iostream>
#include<stdio.h>
#include<windows.h>
#include<math.h>
#include<cstring>
#include<cstdlib>
using namespace std;void RGBtoYUV(int w,int h,int size,unsigned char*RED_BUFFER,unsigned char*GREEN_BUFFER,unsigned char*BLUE_BUFFER);typedef struct TGAFILEHEADER1{BYTE IDLENGTH;//图像信息字段长度,1个字节,值为0,则表示在这个文件中没有图像信息字段。BYTE COLORMAPTYPE;//颜色表类型,1个字节,0 表示没有颜色表,1 表示颜色表存在BYTE IMAGETYPE;//图像类型,1个字节
}TGAFILEHEADER1;typedef struct TGAFILEHEADER2 {WORD FIRSTENTRYINDEX; //颜色表首地址,2字节WORD COLORMAPLENTH;//颜色表长度,2字节BYTE COLORMAPENTRYSIZE;//颜色表表项大小,1字节//每个表项占用的位数,典型的值有15,16,24,或者32位
}TGAFILEHEADER2;typedef struct TGAFILEHEADER3 {WORD XORIGION; //2个字节,图像左下角的水平坐标WORD YORIGION;//2个字节,图像左下角的垂直坐标WORD IMAGEWIDTH;//2个字节,图像宽度WORD IMAGEHEIGHT;//2个字节,图像高度BYTE BITDEPTH;//1个字节,像素z深度BYTE IMAGEDESCRIPTOR;//1个字节,图像描述符//0-3位,规定了每个像素属性位的数量。Targa 16, 该值为 0 或 1;Targa 24,该值为 0;Targa 32,该值为 8//4-5位,图像坐标原点位置,00:bottom left,01:bottom right,10:top left,11:top right//6-7位,必需为0。
}TGAFILEHEADER3;int main()
{FILE* TGA = NULL;FILE* RGB = NULL;TGAFILEHEADER1 FILE_HEADER1;TGAFILEHEADER2 FILE_HEADER2;TGAFILEHEADER3 FILE_HEADER3;if (fopen_s(&TGA, "D:\\00\\daxiong.tga", "rb") != 0){cout << "打开tga文件失败" << endl;}else{cout << "成功打开tga文件" << endl;}if (fopen_s(&RGB, "D:\\00\\daxiong.rgb", "wb") != 0){cout << "创建rgb结果文件失败" << endl;}else{cout << "成功创建rgb结果文件" << endl;}fseek(TGA, 0L, SEEK_END);int FileSize;FileSize = ftell(TGA);fseek(TGA, 0L, SEEK_SET);if (fread(&FILE_HEADER1, 1, 3, TGA) == 0){cout << "文件头第一部分读取失败" << endl;}else{cout << "成功读取文件头第一部分" << endl;}if (FILE_HEADER1.IDLENGTH == 0){cout << "此图像无图像信息字段" << endl;}else{cout << "此代码无法分析该图" << endl;}if (FILE_HEADER1.COLORMAPTYPE == 0){cout << "此图像无颜色表" << endl;}else{cout << "此图像有颜色表" << endl;}if (FILE_HEADER1.IMAGETYPE == 2){cout << "为未压缩真彩图像,可以处理!" << endl;}else{cout << "为其他图像类型,此程序无法处理" << endl;}if (fread(&FILE_HEADER2, 1, 5, TGA) == 0){cout << "文件头第二部分读取失败" << endl;}else{cout << "成功读取文件头第二部分" << endl;}int colortype = FILE_HEADER2.COLORMAPENTRYSIZE;cout << "第一个元素索引值 " << FILE_HEADER2.FIRSTENTRYINDEX <<  endl;cout << "颜色表元素个数 " << FILE_HEADER2.COLORMAPLENTH <<  endl;cout << "每个元素的大小 " << colortype << endl;if (fread(&FILE_HEADER3, 1, 10, TGA) == 0){cout << "文件头第三部分读取失败" << endl;}else{cout << "成功读取文件头第三部分" << endl;}int bitdepth = FILE_HEADER3.BITDEPTH;int imagedescriptor = FILE_HEADER3.IMAGEDESCRIPTOR;cout << " 图像 X 坐标起始位置 " << FILE_HEADER3.XORIGION << endl;cout << " 图像 Y 坐标起始位置" << FILE_HEADER3.YORIGION <<  endl;cout << "图像宽度 " << FILE_HEADER3.IMAGEWIDTH <<endl;cout << "图像高度 " << FILE_HEADER3.IMAGEHEIGHT << endl;cout << "图像每像素存储占用位数 " << bitdepth << endl;cout << "图像描述符字节数据" << imagedescriptor << endl;int FILEHEADERSIZE = sizeof(FILE_HEADER1) + sizeof(FILE_HEADER1) + sizeof(FILE_HEADER1);int width = 0;int height = 0;width = FILE_HEADER3.IMAGEWIDTH;height = FILE_HEADER3.IMAGEHEIGHT;int DataSize = 0;DataSize = width * height * bitdepth / 8;unsigned char* DATA = new unsigned char[DataSize];unsigned char* RED = new unsigned char[height * width];unsigned char* GREEN = new unsigned char[height * width];unsigned char* BLUE = new unsigned char[height * width];unsigned char* ALPHA = new unsigned char[height * width];if (FILE_HEADER1.COLORMAPTYPE == 0){if (fread(DATA, sizeof(unsigned char), DataSize, TGA) == 0){cout << "读入数据失败" << endl;}else{cout << "成功读入数据" << endl;}if (imagedescriptor == 1){int j = DataSize / 2;for (int i = 0; i < DataSize;){ALPHA[j] = DATA[i + 1] & 10000000;RED[j] = (DATA[i+1] &01111100) << 1;GREEN[j] = ((DATA[i+1] & 00000011) << 6) | ((DATA[i] & 11100000) >> 2);BLUE[j] = (DATA[i] & 00011111) << 3;i += 2;j--;}}if (imagedescriptor == 0){int j = DataSize / 3;for (int i = 0; i < DataSize;){RED[j] = DATA[i + 2];GREEN[j] = DATA[i + 1];BLUE[j] = DATA[i];i += 3;j--;}}else if (imagedescriptor == 8){int j = DataSize / 4;for (int i = 0; i < DataSize;){ALPHA[j] = DATA[i + 3];RED[j] = DATA[i + 2];GREEN[j] = DATA[i + 1];BLUE[j] = DATA[i];i += 4;j--;}}else{cout << "此代码无法分析该图" << endl;}}else{cout << "此代码无法分析该图" << endl;}fwrite(BLUE, sizeof(unsigned char), width* height, RGB);fwrite(GREEN, sizeof(unsigned char),  width* height, RGB);fwrite(RED, sizeof(unsigned char),  width* height, RGB);RGBtoYUV(width, height, width*height*3 , RED, GREEN, BLUE);system("pause");
}

rgb转yuv

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<cstdlib>
#include <windows.h>
using namespace std;void RGBtoYUV(int w,int h,int size,unsigned char*RED_BUFFER,unsigned char*GREEN_BUFFER,unsigned char*BLUE_BUFFER)
{FILE* YUV = NULL;if (fopen_s(&YUV, "D:\\00\\daxiong.yuv", "wb") != 0){cout << "Failed to create the yuv file!" << endl;}else{cout << "Successfully created the yuv file!" << endl;}unsigned char* Y_BUFFER = new unsigned char[size / 3]; unsigned char* U_BUFFER = new unsigned char[size / 12]; unsigned char* V_BUFFER = new unsigned char[size / 12];for(int i=0;i<size/3;i++)//计算各点Y分量{Y_BUFFER[i]=RED_BUFFER[i]*0.2990+GREEN_BUFFER[i]*0.5870+BLUE_BUFFER[i]*0.1140;if(Y_BUFFER[i]>235){Y_BUFFER[i]=235;}if(Y_BUFFER[i]<16){Y_BUFFER[i]=16;}}int u=0;for(int i=0; i<size/3;)//计算u分量{U_BUFFER[u]=(RED_BUFFER[i]+RED_BUFFER[i+1]+RED_BUFFER[i+w]+RED_BUFFER[i+w+1])/4 *(-0.1684)+(GREEN_BUFFER[i]+GREEN_BUFFER[i+1]+GREEN_BUFFER[i+w]+GREEN_BUFFER[i+w+1])/4*(-0.3316)+(BLUE_BUFFER[i]+BLUE_BUFFER[i+1]+BLUE_BUFFER[i+w]+BLUE_BUFFER[i+w+1])/4*(0.500)+128;if(U_BUFFER[u]>235){U_BUFFER[u]=235;}if(U_BUFFER[u]<16){U_BUFFER[u]=16;}if(i%256==254){i=i+258;}else{i=i+2;}u++;}int v=0;for(int i=0; i<size/3;){V_BUFFER[v]=(RED_BUFFER[i]+RED_BUFFER[i+1]+RED_BUFFER[i+w]+RED_BUFFER[i+w+1])/4*(0.5)+(GREEN_BUFFER[i]+GREEN_BUFFER[i+1]+GREEN_BUFFER[i+w]+GREEN_BUFFER[i+w+1])/4*(-0.4187)+(BLUE_BUFFER[i]+BLUE_BUFFER[i+1]+BLUE_BUFFER[i+w]+BLUE_BUFFER[i+w+1])/4*(-0.0813)+128;if(V_BUFFER[v]>235){V_BUFFER[v]=235;}if(V_BUFFER[v]<16){V_BUFFER[v]=16;}if(i%256==254){i=i+258;}else{i=i+2;}v++;}fwrite(Y_BUFFER, sizeof(unsigned char), size/3, YUV);fwrite(U_BUFFER, sizeof(unsigned char), size/12, YUV);fwrite(V_BUFFER, sizeof(unsigned char), size/12, YUV);}

四、实验结果

生成了yuv文件,长度不足一帧,暂未找到原因。

实验2:tga格式图像转换为yuv格式相关推荐

  1. 使用C++实现YUV格式图像与RGB格式图像之间相互转换

    使用C++实现YUV格式图像与RGB格式图像之间相互转换 一.RGB与YUV转换公式 1.RGB转YUV 1)RGB转换亮度与色差信号公试: 2)归一化为YUV的转化公试为: 2.YUV转RGB 二. ...

  2. 视频图像数据处理八:将rgb视频图像转换为yuv420格式视频图像

    文章目录 转换公式 需要注意 函数代码 测试用例 下载 本文介绍了将rgb视频图像转换为yuv420格式视频图像的方法,附有详细的代码和图像示例.文中rgb24和yuv420文件需要使用yuv/rgb ...

  3. python matplotlib模块画出的图像转换为.tiff格式

    利用python matplotlib模块(python3.7.1)画出的图表暂不支持直接导出.tiff格式的图片,但是可以导出eps, pdf, pgf, png, ps, raw, rgba, s ...

  4. php格式转为jpg格式,如何在PHP中将所有图像转换为JPG格式?

    我正在用PHP开发一个网站,该网站允许用户上传图像,然后让他决定图像应如何使用jQuery- PHP整数选择要作为图片的区域,然后单击"裁剪"按钮将其裁剪并保存. 我面临的问题是并 ...

  5. opencv把图片转换成二进制_Python+OpenCV实现将图像转换为二进制格式

    Python+OpenCV实现将图像转换为二进制格式 发布时间:2020-09-20 20:30:58 来源:脚本之家 阅读:68 作者:大蛇王 在学习tensorflow的过程中,有一个问题,ten ...

  6. 在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像

    An HSV is another type of color space in which H stands for Hue, S stands for Saturation and V stand ...

  7. js 图片格式转换为jpg_如何将图像转换为JPG格式

    js 图片格式转换为jpg Many websites have strict rules that limit the size and type of image format you're al ...

  8. 将BMP 格式图片转换为 JPEG 格式【c语言】

    源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm=1001.2014.3001.5502. 一.任务及目标 利 ...

  9. 将BMP 格式图片转换为 JPEG 格式【c语言源码】

    原理及代码讲解链接: https://blog.csdn.net/qq_44394952/article/details/122587306?spm=1001.2014.3001.5502. 主函数m ...

  10. python输出jpg_利用python实现.dcm格式图像转为.jpg格式

    如下所示: import pydicom import matplotlib.pyplot as plt import scipy.misc import pandas as pd import nu ...

最新文章

  1. 业界 | 每天1.4亿小时观看时长,Netflix怎样存储这些时间序列数据?
  2. 一文了解当今AI的失落
  3. 《系统集成项目管理工程师》必背100个知识点-27产品范围和项目范围
  4. ITK:两幅图像之差的绝对值
  5. select及触发方式,select监听多链接,select与epoll的实现区别
  6. 【渝粤教育】国家开放大学2018年秋季 0109-21T公司财务 参考试题
  7. java中Decimaformat_Java中 DecimalFormat 用法详解
  8. 部署FIM 2010 R2—1先决条件准备
  9. 用 Windows Live Writer [最新版本] 发布 51CTO 博客
  10. xml中加html源码,从xml获取数据以插入html标签,但在源代码中未看到
  11. Matplotlib Toolkits:三维绘图工具包matplotlib.mplot3d
  12. Shiro 权限验证原理
  13. 二、Arduino软件下载-安装-测试教程
  14. 基于Lumerical fdtd的超透镜设计(介质天线结构和金属谐振结构)
  15. NVR和DVR有什么区别
  16. C# TSC TE244 PrintDocument 固定资产哑银不干胶标签打印
  17. vs2017 error1071:在注释中遇到意外的文件结束
  18. 硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍
  19. 《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别
  20. CSS3实用效果大全

热门文章

  1. php开发我的世界插件,[搬运插件] [服务端插件] [管理]PlotMe——地皮插件[1.2.5-1.10.2]...
  2. 如何批量修改抖音视频的分辨率
  3. Django相关文档地址
  4. 计算机启动时硬盘指示灯不亮,电脑启动时没有自检声,硬盘指示灯不亮
  5. 注册界面模板HTML+CSS
  6. 微信小商店设置服务器,微信小商店绑定运营者微信号步骤流程
  7. 密歇根州立大学计算机专业排名,密歇根州立大学优势专业及优势专业排名(QS世界排名)...
  8. 计算机专业sci二区难吗,二区的sci有多难?sci二区版面费一般多少?
  9. php是哪个快递,php快递查询API类(支持各种快递的查询)
  10. MATLAB绘图中特殊符号的插入方法