TGA文件转YUV文件
文件头
#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文件相关推荐
- BMP文件转YUV文件_C语言实现
一.最终实现的效果 BMP图像序列(本次实验共195张BMP图片)如下: 上述BMP图片经过程序转换后,生成YUV图像如下: 上述YUV文件经过YUVPlayer播放后,效果如下: 对于不同位数的图像 ...
- Linux 下 ffmpeg命令行将h264文件转yuv文件
将h264文件放到主目录下 ~$ ffmpeg -i text.h264 -vcodec rawvideo -an out.yuv
- MP4文件转YUV格式
mp4文件变为YUV文件 用ffmpeg一行代码解决. 例如:诺爹的一个MP4视频,现把它变为一个YUV序列. 打开命令提示符cmd,输入 ffmpeg -i soccer.mp4 soccer_32 ...
- TGA格式文件转化为YUV文件
因为之前分析的PNG格式文件数据有压缩,不太好提取数据,所以这一次尝试将TGA格式的文件转化为YUV格式的文件. TGA文件的文件头中包括图片类型.图片的宽高数据.每像素占用的bit位数等数据,本次的 ...
- 统计rgb与yuv文件中各分量的熵
统计rgb与yuv文件中各分量的熵 要求 提示 代码 结果 分析 要求 对群里发的down.rgb和down.yuv分析三个通道的概率分布,并计算各自的熵. 提示 两个文件的分辨率均为256*256, ...
- python 16bit转8bit的工具_利用python读取YUV文件 转RGB 8bit/10bit通用
注:本文所指的YUV均为YUV420中的I420格式(最常见的一种),其他格式不能用以下的代码. 位深为8bit时,每个像素占用1字节,对应文件指针的fp.read(1): 位深为10bit时,每个像 ...
- python 读取jpg文件是yuv_Python读取YUV文件,并显示的方法
今天小编就为大家分享一篇Python读取YUV文件,并显示的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 Python读取YUV格式文件,并使用opencv显示的方法 open ...
- 完成一个YUV文件播放器
前面匆忙写了很多篇文章,虽然都很简单,但着实花了不少时间去研究的.几年前写了YUV转换RGB的代码,当时只限于转换成BMP来测试正确性.后来一直使用YUV Player Deluxe来看YUV文件,但 ...
- 简要分析JM8.6代码中foreman_part_qcif.yuv文件的YUV数据如何悄无声息地进入程序
分析encode_one_frame函数. 先来看下结构体Sourceframe的定义: typedef struct {// Size infoint x_size, y_framesize, y_ ...
- HM-16.0编码过程:将YUV文件编码成HEVC格式的码流
HM-16.0编码:将YUV文件编码成HEVC格式的码流 注: 1 为了快速优化运行(不调程序的时候),可以将程序的版本设为"release",否则还是设为"debu ...
最新文章
- 使用vtwinfx插件时fcpx意外退出_FCPX插件:60种电视屏幕切换转场 TRANSTELE
- 倒立摆的数学模型,matlab程序,simulink,c语言控制,一级倒立摆的控制设计
- linux怎么到conf目录,linux - 如何在没有.conf文件的情况下从Ubuntu下的命令行连接到WiFi? - Ubuntu问答...
- php3绕过,PHPB2B注入#3(绕过过滤)
- lisp 标记形心_标记-整理算法
- Java并发编程-ReentrantLock
- ApacheCN 大数据译文集 20211206 更新
- 利润暴增800%,单车成本降至22.7万元!特斯拉交出最强年报
- Oracle常见操作和命令
- 详解机器学习之the Learning Problem
- 关于collectionView的一些内容
- Sublime Text:安装插件、卸载插件
- 安装ORK功能包踩坑之路和解决方案
- 简单数据查询——单表无条件和有条件查询
- 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系.pdf
- 2020我也当了面试官-java面试题之一
- 如何修改host文件权限
- 如何“快准狠”的找到内存的问题
- [转]:职场不得不知的4大潜规则
- 使用聚类分析 构建信用卡高风险客户识别模型
热门文章
- 百度站长平台做https认证总是通不过,验证失败如何解决
- 原创,呵呵(一张图看明白),USB转TTL、USB转串口、USB转232的区别
- MBA-day21 假言推理-练习题
- C# 操作Word页眉页脚——奇偶页/首页不同、不连续设置页码、复制页眉页脚、锁定页眉页脚、删除页眉页脚...
- 旋风系统时间与服务器不一致,更新公告 | 8月15日早8点停服维护
- 20192209 Exp2-后门原理与实践
- 修改Sublime Text 默认*.sublime-package文件
- 小程序源码:图片秒加水印制作生成-多玩法安装简单
- 3D环绕音乐单页网站源码
- 大局观有多重要?如何拥有大局观?