文件头

#include "pch.h"
#include <iostream>
#include <cstdio>
#include <fstream>
#include <windows.h>
#include <malloc.h>
#include <stdlib.h>
using namespace std;

TGA结构体

typedef struct _TgaHeader
{BYTE IDLength;       BYTE ColorMapType;
BYTE ImageType;      }TGAHEAD;typedef struct _TgaHeaderCMap
{
WORD CMapStart;
WORD CMapLength;
BYTE CMapDepth;
}TGAHEADCMAP;typedef struct _TgaHeaderImage
{
WORD XOffset;
WORD YOffset;
WORD Width;
WORD Height;
BYTE PixelDepth;
BYTE ImageDescriptor;
}TGAHEADIMG;

打开文件

int main()
{
FILE *TgaFile = NULL, *YuvFile = NULL, *RgbFile = NULL;
if ((TgaFile = fopen("D:\\数据压缩\\16.tga", "rb")) == NULL)
{
printf("tga file open failed!");
exit(0);
}
if ((YuvFile = fopen("D:\\数据压缩\\16.yuv", "wb")) == NULL)
{
printf("yuv file  open failed!");
exit(0);
}
TGAHEAD tga_header;
TGAHEADCMAP tga_header_cmap;
TGAHEADIMG tga_header_img;
fread(&tga_header, 3, 1, TgaFile);
fread(&tga_header_cmap, 5, 1, TgaFile);
fread(&tga_header_img, 10, 1, TgaFile);
unsigned char* ImageData = NULL;
unsigned char* b = NULL;
unsigned char* g = NULL;
unsigned char* r = NULL;
unsigned char* R = NULL;
unsigned char* G = NULL;
unsigned char* B = NULL;
unsigned char* Y = NULL;
unsigned char* U = NULL;
unsigned char* V = NULL;
unsigned char* u = NULL;
unsigned char* v = NULL;
unsigned char* RGB = NULL;
unsigned char* YUV = NULL;

颜色表部分

if (tga_header.ColorMapType == 0)//不带颜色表
{if (tga_header.ImageType == 0)exit(0);else if (tga_header.ImageType == 2)//未压缩的真彩色图像{int depth = tga_header_img.PixelDepth;int width = tga_header_img.Width;int height = tga_header_img.Height;int size = width * height * depth / 8;//整个图像块的大小cout << "该文件是未压缩的真彩色图像" << endl;cout << "图像分辨率为" << width << "×" << height << endl;cout << "像素深度为" << depth << "bit" << endl;ImageData = new unsigned char[size];fread(ImageData, 1, size, TgaFile);b = (unsigned char *)malloc(sizeof(char)*(width * height));g = (unsigned char *)malloc(sizeof(char)*(width * height));r = (unsigned char *)malloc(sizeof(char)*(width * height));R = (unsigned char *)malloc(sizeof(char)*(width * height));G = (unsigned char *)malloc(sizeof(char)*(width * height));B = (unsigned char *)malloc(sizeof(char)*(width * height));Y = (unsigned char *)malloc(sizeof(char)*(width * height));U = (unsigned char *)malloc(sizeof(char)*(width * height));V = (unsigned char *)malloc(sizeof(char)*(width * height));u = (unsigned char *)malloc(sizeof(char)*(width * height / 4));v = (unsigned char *)malloc(sizeof(char)*(width * height / 4));RGB = new unsigned char[width * height * 3];

打开16位的TGA

 if (tga_header_img.PixelDepth == 16)*/{for (int j = 0, i = 0; i < width * height; i++){{b[i] = (ImageData[j] & 0x1F) << 3;g[i] = ((ImageData[j + 1] & 0x03) << 6) + ((ImageData[j] & 0xE0) >> 2);r[i] = ((ImageData[j + 1] & 0x7C)) << 1;j = j + 2;}}}for (int k = 0, i = height - 1; i >= 0; i--){for (int j = 0; j < width; j++){RGB[k] = b[j + i * width];RGB[k + 1] = g[j + i * width];RGB[k + 2] = r[j + i * width];k = k + 3;}}for (int i = 0, j = 0; i < width*height * 3; i = i + 3, j++){R[j] = RGB[i + 2];G[j] = RGB[i + 1];B[j] = RGB[i];}

计算YUV分量

 for (int i = 0, j = 0; i < width*height; i++, j++){Y[j] = 0.2990*R[i] + 0.5870*G[i] + 0.1140*B[i];U[j] = -0.1684*R[i] - 0.3316*G[i] + 0.5*B[i] + 128;V[j] = 0.5*R[i] - 0.4187*G[i] - 0.0813*B[i] + 128;}

对UV下采样

 for (int k = 0, i = 0; i < height; i = i + 2){for (int j = 0; j < width; j = j + 2){u[k] = (U[width*i + j] + U[width*i + j + 1] + U[(i + 1)*width + j] + U[(i + 1)*width + j + 1]) / 4;v[k] = (V[width*i + j] + V[width*i + j + 1] + V[(i + 1)*width + j] + V[(i + 1)*width + j + 1]) / 4;k++;}}

YUV量化后码电平分配

 for (int k = 0; k < width*height; k++){if (Y[k] > 235)Y[k] = 235;if (Y[k] < 16)Y[k] = 16;}for (int k = 0; k < width*height / 4; k++){if (u[k] > 240)u[k] = 240;if (u[k] < 16)u[k] = 16;if (v[k] > 240)v[k] = 240;if (v[k] < 16)v[k] = 16;}fwrite(Y, 1, width*height, YuvFile);fwrite(u, 1, width*height / 4, YuvFile);fwrite(v, 1, width*height / 4, YuvFile);
}}
else
exit(0);

最后得到

原TGA图

目测没有原图清楚

TGA文件转YUV文件相关推荐

  1. BMP文件转YUV文件_C语言实现

    一.最终实现的效果 BMP图像序列(本次实验共195张BMP图片)如下: 上述BMP图片经过程序转换后,生成YUV图像如下: 上述YUV文件经过YUVPlayer播放后,效果如下: 对于不同位数的图像 ...

  2. Linux 下 ffmpeg命令行将h264文件转yuv文件

    将h264文件放到主目录下 ~$ ffmpeg -i  text.h264 -vcodec rawvideo -an out.yuv

  3. MP4文件转YUV格式

    mp4文件变为YUV文件 用ffmpeg一行代码解决. 例如:诺爹的一个MP4视频,现把它变为一个YUV序列. 打开命令提示符cmd,输入 ffmpeg -i soccer.mp4 soccer_32 ...

  4. TGA格式文件转化为YUV文件

    因为之前分析的PNG格式文件数据有压缩,不太好提取数据,所以这一次尝试将TGA格式的文件转化为YUV格式的文件. TGA文件的文件头中包括图片类型.图片的宽高数据.每像素占用的bit位数等数据,本次的 ...

  5. 统计rgb与yuv文件中各分量的熵

    统计rgb与yuv文件中各分量的熵 要求 提示 代码 结果 分析 要求 对群里发的down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵. 提示 两个文件的分辨率均为256*256, ...

  6. python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用

    注:本文所指的YUV均为YUV420中的I420格式(最常见的一种),其他格式不能用以下的代码. 位深为8bit时,每个像素占用1字节,对应文件指针的fp.read(1): 位深为10bit时,每个像 ...

  7. python 读取jpg文件是yuv_Python读取YUV文件,并显示的方法

    今天小编就为大家分享一篇Python读取YUV文件,并显示的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Python读取YUV格式文件,并使用opencv显示的方法 open ...

  8. 完成一个YUV文件播放器

    前面匆忙写了很多篇文章,虽然都很简单,但着实花了不少时间去研究的.几年前写了YUV转换RGB的代码,当时只限于转换成BMP来测试正确性.后来一直使用YUV Player Deluxe来看YUV文件,但 ...

  9. 简要分析JM8.6代码中foreman_part_qcif.yuv文件的YUV数据如何悄无声息地进入程序

    分析encode_one_frame函数. 先来看下结构体Sourceframe的定义: typedef struct {// Size infoint x_size, y_framesize, y_ ...

  10. HM-16.0编码过程:将YUV文件编码成HEVC格式的码流

    HM-16.0编码:将YUV文件编码成HEVC格式的码流 注: 1   为了快速优化运行(不调程序的时候),可以将程序的版本设为"release",否则还是设为"debu ...

最新文章

  1. 使用vtwinfx插件时fcpx意外退出_FCPX插件:60种电视屏幕切换转场 TRANSTELE
  2. 倒立摆的数学模型,matlab程序,simulink,c语言控制,一级倒立摆的控制设计
  3. linux怎么到conf目录,linux - 如何在没有.conf文件的情况下从Ubuntu下的命令行连接到WiFi? - Ubuntu问答...
  4. php3绕过,PHPB2B注入#3(绕过过滤)
  5. lisp 标记形心_标记-整理算法
  6. Java并发编程-ReentrantLock
  7. ApacheCN 大数据译文集 20211206 更新
  8. 利润暴增800%,单车成本降至22.7万元!特斯拉交出最强年报
  9. Oracle常见操作和命令
  10. 详解机器学习之the Learning Problem
  11. 关于collectionView的一些内容
  12. Sublime Text:安装插件、卸载插件
  13. 安装ORK功能包踩坑之路和解决方案
  14. 简单数据查询——单表无条件和有条件查询
  15. 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系.pdf
  16. 2020我也当了面试官-java面试题之一
  17. 如何修改host文件权限
  18. 如何“快准狠”的找到内存的问题
  19. [转]:职场不得不知的4大潜规则
  20. 使用聚类分析 构建信用卡高风险客户识别模型

热门文章

  1. 百度站长平台做https认证总是通不过,验证失败如何解决
  2. 原创,呵呵(一张图看明白),USB转TTL、USB转串口、USB转232的区别
  3. MBA-day21 假言推理-练习题
  4. C# 操作Word页眉页脚——奇偶页/首页不同、不连续设置页码、复制页眉页脚、锁定页眉页脚、删除页眉页脚...
  5. 旋风系统时间与服务器不一致,更新公告 | 8月15日早8点停服维护
  6. 20192209 Exp2-后门原理与实践
  7. 修改Sublime Text 默认*.sublime-package文件
  8. 小程序源码:图片秒加水印制作生成-多玩法安装简单
  9. 3D环绕音乐单页网站源码
  10. 大局观有多重要?如何拥有大局观?