一、 文件格式

Tga常见的格式有非压缩RGB和压缩RGB两种格式,其他格式的我们在这里不做讲述。文件的第三个Byte位作为标记:2为非压缩RGB格式,10为压缩RGB格式。在此次实验中,分析未压缩的tga图片。

未压缩格式:

名称 偏移 长度 说明
图像信息字段长度 0 1 本字段为1字节无符号整型,指出图像信息字段的长度,其取值范围为0~255,当它为0时,表示没有图像的信息字段
颜色表类型 1 1 0表示没有颜色表,1表示颜色表存在
图像类型码 2 1 该字段总为2,表示无压缩图像
颜色表首址 3 2 颜色表首的入口索引,整型(低位-高位)
颜色表的长度 5 2 颜色表的表项总数,整型(低位-高位)
颜色表项位数 7 1 位数(bit),16代表16位TGA,24位代表24位TGA,32代表32位TGA
图像X坐标起始位置 8 2 图像左下角X坐标的整型值
图像Y坐标其实位置 10 2 图像左下角Y坐标的整型值
图像宽度 12 2 以像素为单位,图像宽度的整型
图像高度 14 2 以像素为单位,图像高度的整型
图像每像素存储占用位数 16 2 它的值为16,24或32等等,决定了该图像时TGA16,TGA24,TGA32等等
图像描述字节 17 1 bits 3-0 - 每像素对应的属性位的位数;对于TGA 16,该值为 0 或 1,对于 TGA24,该值为 0,对于 TGA 32,该值为 8。 bit 4 - 保留,必须为 0。bit 5 - 屏幕起始位置标志,0 = 原点在左下角,1 = 原点在左上角对于 truevision 图像必须为 0。bits 7-6 - 交叉数据存储标志:00 = 无交叉;01 = 两路奇/偶交叉;10 = 四路交叉;11 = 保留
图像信息字段 18 可变 包含一个自由格式的,长度是图像由“图像信息字段”指定。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以含有 255 个字符。如果需要存储更多信息,可以放在图像数据之后
颜色表数据 可变 可变 如果颜色类型为0,则该域不存在,否则越过该域直接读取图像颜色表规格中描述了每项的字节数,为2,3,4之一
图像数据 可变 可变 RGB颜色数据,存放顺序为BGR,数据从图像左下角开始存储

参考:文件格式分析

二:代码部分

rgb2yuv.cpp

#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include"TgaHeader.h"int rgb2yuv(void* rgb_s, void* y_s, void* u_s, void* v_s, int W, int H)
{unsigned char *r = NULL, *g = NULL, *b = NULL, *rgb = NULL;unsigned char *y, *u, *v, *U, *V;rgb = (unsigned char *)rgb_s;y = (unsigned char *)y_s;u = (unsigned char *)u_s;v = (unsigned char *)v_s;r = (unsigned char *)malloc(sizeof(char)*(W*H));g = (unsigned char *)malloc(sizeof(char)*(W*H));b = (unsigned char *)malloc(sizeof(char)*(W*H));U = (unsigned char *)malloc(sizeof(char)*(W*H));V = (unsigned char *)malloc(sizeof(char)*(W*H));int j=0;for (int i = 0; i < W*H; i++){b[i] = rgb[j];g[i] = rgb[j+1];r[i] = rgb[j+2];j += 3;}for (int i = 0; i < H*W; i++){y[i] = r[i]*0.2990 + g[i]*0.5870 + b[i]*0.1140;U[i] = r[i]*(-0.1684) - g[i]*0.3316 + b[i]*0.5 + 128;V[i] = r[i]*0.5 - g[i]*0.4187 - b[i]*0.0813 + 128;}int k = 0;for (int i = 0; i < H; i = i + 2){for (j = 0; j < W; j = j + 2){u[k] = (U[W*i + j] + U[W*i + j + 1] + U[(i + 1)*W + j] + U[(i + 1)*W + j + 1]) / 4;v[k] = (V[W*i + j] + V[W*i + j + 1] + V[(i + 1)*W + j] + V[(i + 1)*W + j + 1]) / 4;k++;}}return 0;
}

main.cpp

#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include"TgaHeader.h"using namespace std;struct TGA_HEADER
{unsigned short IDLength;unsigned short ImageType;unsigned short ColorMapLen;unsigned char ColorMapBits;unsigned int Width;unsigned int Height;unsigned char bitsPerPixel;
}TGAHEADER;int main(int argc, char **argv)
{FILE *TgaFile = NULL;FILE *YuvFile = NULL;char *TgaFileName = NULL;char *YuvFileName = NULL;TgaFileName = argv[1];YuvFileName = argv[2];int Height, Width;int offset = 0;if (fopen_s(&TgaFile, TgaFileName, "rb") == 0)printf("The tgafile was opened: %s \n", TgaFileName);else printf("The tgafile cannot open: %s \n", TgaFileName);fopen_s(&YuvFile, YuvFileName, "wb");unsigned char typeHeader[18] = { 0 };fread(typeHeader, 1, 18, TgaFile);TGAHEADER.IDLength = typeHeader[0];TGAHEADER.ImageType = typeHeader[2];TGAHEADER.ColorMapLen = (typeHeader[6] << 8) + typeHeader[5];TGAHEADER.ColorMapBits = typeHeader[7];TGAHEADER.Width = (typeHeader[13] << 8) + typeHeader[12];TGAHEADER.Height = (typeHeader[15] << 8) + typeHeader[14];TGAHEADER.bitsPerPixel = (typeHeader[17] << 8) + typeHeader[16];unsigned short pixel = TGAHEADER.bitsPerPixel / 8;unsigned short ColorPixel = TGAHEADER.ColorMapBits / 8;Width = TGAHEADER.Width;Height = TGAHEADER.Height;printf("该tga图片的大小为: %d * %d \n", TGAHEADER.Width, TGAHEADER.Height);int i, j;unsigned char *tgaBuffer = NULL;unsigned char *rgbBuffer = NULL;unsigned char *yBuffer = NULL;unsigned char *uBuffer = NULL;unsigned char *vBuffer = NULL;unsigned char *colorBuffer = NULL;unsigned char *colormapBuffer = NULL;yBuffer = (unsigned char *)malloc(Width*Height);uBuffer = (unsigned char *)malloc(Width*Height / 4);vBuffer = (unsigned char *)malloc(Width*Height / 4);tgaBuffer = (unsigned char *)malloc(Width*Height * 3);rgbBuffer = (unsigned char *)malloc(Width*Height * 3);offset = TGAHEADER.IDLength + 18;fseek(TgaFile, offset, SEEK_SET);switch (pixel){case 3:fread(tgaBuffer, 1, Width*Height*pixel, TgaFile);break;case 4:unsigned char *tgaB = NULL;fread(tgaB, 1, Width*Height*pixel, TgaFile);int a = 0, b = 0;for (i = 0; i < Height; i++){for (j = 0; j < Width; j++){tgaBuffer[a] = tgaB[b];tgaBuffer[a + 1] = tgaB[b + 1];tgaBuffer[a + 2] = tgaB[b + 2];a += 3;b += 4;}}free(tgaB);}for(i=0;i<Height;i++)for (j = 0; j < Width * 3; j++){rgbBuffer[Width * 3 * i + j] = tgaBuffer[Width * 3 * (Height - i - 1) + j];}if((rgb2yuv(rgbBuffer,yBuffer,uBuffer,vBuffer,Width,Height)==0))printf("yuvFile has finished\n");else{printf("error\n");exit(1);}fwrite(yBuffer, 1, Width*Height, YuvFile);fwrite(uBuffer, 1, Width*Height/4, YuvFile);fwrite(vBuffer, 1, Width*Height/4, YuvFile);free(yBuffer);free(uBuffer);free(vBuffer);free(tgaBuffer);free(rgbBuffer);fclose(TgaFile);fclose(YuvFile);return 0;
}

TgaHeader.h

#pragma once
int rgb2yuv(void* rgb_s, void* y_s, void* u_s, void* v_s, int W, int H);

三:实验结果

原图tga:
转换结果yuv:

实验二:tga格式图片转yuv格式相关推荐

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

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

  2. web前端入门学习 css(10)移动端布局(学到DPG格式图片与webp格式图片停了)

    https://www.bilibili.com/video/BV14J4114768?p=390 代码:https://gitee.com/xiaoqiang001/html_css_materia ...

  3. 如何批量将 bmp 格式图片转换为 png 格式

    概要:bmp 格式是纹的操作系统当中非常常见的一种图片格式,这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,所以导致了它存在一个很大的缺点,那就是占用磁盘空间过大,那么我们怎么将 bmp 格式的 ...

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

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

  5. 如何批量将 webp 格式图片转换为 png 格式

    概要:在之前的文章当中,我们对 webp 格式的图片做过一些简单的介绍.这种格式是一种用于 web 项目的新的图像格式,他可以大大提高网站访问速度,因为同样的分辨率的 webp 格式的图片,它的大小要 ...

  6. 通过浏览器,将webp格式图片转jpg格式

    概述 我们网络上下载的图片,很多的是webp格式的图片,而目前支持这种图片格式的软件较少,比如Windows 照片查看器,是不能直接打开图片的.安装其他专业图像软件又麻烦. 因此,本文介绍利用电脑常用 ...

  7. 采用计算机发布调度命令时 必须严格遵守,实用文档其他之铁路调度命令格式图片调度命令规范格式...

    铁路调度命令格式图片调度命令规范格 式 一.发布行车调度命令的 原则 1.指挥列车运行的命令和口头指示,只能由列车调度员发布. 旅客列车的加开.停运.折返.变更径路及车辆甩挂的命令, 经铁道部.铁路局 ...

  8. jpg/png格式图片转eps格式

    一.Photoshop 使用Photoshop软件,将jpg或者png图片另存为eps格式. 二.latex自带命令bmeps 图片存放路径:C:\Users\Administrator\Deskto ...

  9. jpg/png格式图片转eps格式的方法总结

    转自:http://blog.sina.com.cn/s/blog_5410e7b50101lme2.html 用latex写论文的筒子应该遇到这样的问题:latex在一般情况下,只支持eps格式的图 ...

  10. 怎么把PNG格式图片转JPG格式?教你一键转换格式的方法

    怎么把PNG格式的图片转换成JPG格式呢?大家都知道图片的格式有很多种,但是绝大多数的图片格式我们在日常中是无法使用的,很多设备不支持打开,其中我们最常用的图片格式就是PNG和JPG格式的图片,一般情 ...

最新文章

  1. 软考总结——虚存管理
  2. Java-二分查找算法
  3. redis的学习资源
  4. mysql 报错解决思考Expression #5 of SELECT list is not in GROUP BY clause and contains nonaggregated column
  5. 芸众商城社交电商系统V2.2.64
  6. python文件命名 数字,当文件存在时,文件名中的数字递增
  7. 帧栈使用的基本用法c语言,栈帧详解
  8. 蓝桥杯 ALGO-141 算法训练 P1102
  9. ZZULIOJ 1917: E
  10. Pareidolia — AI的艺术教学
  11. 第九届大唐杯省赛知识梳理-5G协议与信令(20%)
  12. 遥感数字图像处理学习 一、概念及组成
  13. eclipse 编译器 unhandled event loop exception 异常解决办法
  14. Exif 格式介绍和操作
  15. 我们为什么不画高保真原型图
  16. 倒数15日开幕!第八届全球云计算大会解锁主论坛重磅嘉宾
  17. 高德地图PC版国内首发室内地图
  18. 古代的银子和现在的人民币换算关系..
  19. 易推宝网络推广效果怎么样?
  20. css3宽度变大动画_H5 直播的疯狂点赞动画是如何实现的?

热门文章

  1. 2013年春节放假通知
  2. app营销实训报告_市场营销模拟软件实训报告
  3. 【身份证识别】基于matlab GUI形态学二代身份证号码识别系统【含Matlab源码 948期】
  4. 华为认证HCNE考试知识点
  5. 巨潮网站爬虫程序修改
  6. PS——制作一寸照片、小二寸照片、二寸照片
  7. 网红漏洞“致远OA系统上的GetShell漏洞”详解
  8. FastAPI 快速入门
  9. 2021年茶艺师(中级)新版试题及茶艺师(中级)考试总结
  10. 2021年茶艺师(初级)报名考试及茶艺师(初级)实操考试视频