I420格式纹理图像的转换方法、存储介质、电子设备及系统与流程

文档序号:16323311发布日期:2018-12-19 05:47阅读:436来源:国知局
I420格式纹理图像的转换方法、存储介质、电子设备及系统与流程

本发明涉及纹理图像转换领域,具体涉及一种i420格式纹理图像的转换方法、存储介质、电子设备及系统。

背景技术

direct3d10(图形加速接口)在win7系统下显示i420格式的纹理图像时,需要先将i420格式的图像转换为a8r8g8b8格式的图像。

i420格式是yuv(颜色编码方法)格式的一种,yuv格式分为三个分量,“y”表示明亮度(luminance或luma),也就是灰度值;而“u”和“v”表示的则是色度(chrominance或chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。yuv格式主要用于电视系统以及模拟视频领域,它将亮度信息(y)与色彩信息(uv)分离,没有uv信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,yuv不像rgb那样要求三个独立的视频信号同时传输,所以用yuv格式传输数据占用的频宽极少。

yuv码流的存储格式与其采样的方式密切相关,主流的采样方式有三种,yuv4:4:4,yuv4:2:2,yuv4:2:0。yuv格式有两大类:planar平面格式和packed打包格式。对于planar的yuv格式,先连续存储所有像素点的y,紧接着存储所有像素点的u,随后是所有像素点的v。对于packed的yuv格式,每个像素点的y,u和v是连续交错存储的。

i420是yuv4:2:0采样格式中的一种格式,在其存储格式中是按三个平面进行存储像素的,第一个平面是y像素平面,第二个平面是u像素平面,第三个平面是v像素平面。假设某幅i420格式的图像的宽是w,高是h;那么y像素平面的宽是w,高是h,y像素平面中每个像素大小是1字节,在不考虑内存对齐的情况下,那么y平面所有像素所占的字节大小就是w·h。而u像素平面的宽是w/2,高是h/2,u像素平面中每个像素大小同样是1字节,同样在不考虑内存对齐的情况下,那么u平面所有像素所占的字节大小就是w/2·h/2=w·h/4。而v像素平面的排列与u像素平面一致,宽同样是w/2,高同样是h/2,其所占的字节大小同样是w·h/4。

由此可知,整幅i420格式的图像所占的总内存大小就是y平面像素的内存大小加上u、v平面所占的内存大小,利用上面的公式就是w·h+w·h/4+w·h/4也就是w·h·3/2个字节大小。

a8r8g8b8格式是rgb颜色格式(red、green、blue,红、绿、蓝三色色彩格式)的一种,a8r8g8b8表示该rgb图像共有4个通道:a(alpha,透明度)通道,r(red,红色)通道,g(green,绿色)通道,b(blue,蓝色)通道;每个通道占8位,也就是1个字节大小,即该图像中每个像素所占的字节大小就是4,所以一幅宽度为w,高度为h的此种格式图像,其所占的内存大小为w·h·4个字节。

目前,将i420格式的图像转换为a8r8g8b8格式的图像的方法一般为:利用转换函数,cpu在系统内存中将i420格式的图像转换为a8r8g8b8的图像。由于cpu是计算机的工作核心,因此cpu进行像素格式转换的同时,必然会进行其他工作;也就是说像素格式转换的数据传输带宽难以在cpu上达到最大,进而延长了像素格式转换的计算过程,降低了像素格式转换的转换效率;尤其当需要转换的图像的宽高非常大时,转换效率更为低下。



技术实现要素:

针对现有技术中存在的缺陷,本发明解决的技术问题为:如何缩短纹理图像的格式由i420转换为a8r8g8b8时的计算过程。本发明能够通过gpu执行工作量最大的格式转换操作,显著降低了cpu的工作压力和系统内存,进而大幅度增大像素格式转换时的数据传输带宽,即缩短了像素格式转换的计算过程,提高了转换效率。

为达到以上目的,本发明提供的i420格式纹理图像的转换方法,包括以下步骤:

步骤a:根据需要转换的i420格式的纹理图像,创建3幅相同像素格式的输入纹理图像:py、pu和pv;py用于承载i420格式的纹理图像的y像素平面,pu用于承载i420格式的纹理图像的u像素平面,pv用于承载i420格式的纹理图像的v像素平面;根据i420格式的纹理图像,创建用于承载a8r8g8b8格式的输出纹理图像,转到步骤b;

步骤b:将py、pu和pv输入至gpu;gpu通过hlsl语言,确定py在坐标(i,j)处的y像素值、pu在坐标(i,j)处的u像素值、以及pv在坐标(i,j)处的v像素值;根据y像素值和v像素值,计算输出纹理图像的r通道值target.r;根据y像素值、v像素值和u像素值,计算输出纹理图像的g通道值target.g;根据y像素值和u像素值,计算输出纹理图像的b通道值target.b,输出纹理图像的a通道值target.a自定义设置,转到步骤c;

步骤c:gpu将target.r、target.g、target.b和target.a,赋值至步骤a中所述a8r8g8b8格式的输出纹理图像。

本发明提供的存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现上述i420格式纹理图像的转换方法。

本发明提供的电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,处理器执行计算机程序时实现上述i420格式纹理图像的转换方法。

本发明提供的i420格式纹理图像的转换系统,包括纹理图像创建模块、像素格式转换模块和纹理图像显示模块;

纹理图像创建模块用于:根据需要转换的i420格式的纹理图像,创建3幅相同像素格式的输入纹理图像:py、pu和pv;py用于承载i420格式的纹理图像的y像素平面,pu用于承载i420格式的纹理图像的u像素平面,pv用于承载i420格式的纹理图像的v像素平面;根据i420格式的纹理图像,创建用于承载a8r8g8b8格式的输出纹理图像,向像素格式转换模块发送像素格式转换信号;

像素格式转换模块用于:收到像素格式转换信号后,将py、pu和pv输入至gpu;控制gpu通过hlsl语言,确定py在坐标(i,j)处的y像素值、pu在坐标(i,j)处的u像素值、以及pv在坐标(i,j)处的v像素值;根据y像素值和v像素值,计算输出纹理图像的r通道值target.r;根据y像素值、v像素值和u像素值,计算输出纹理图像的g通道值target.g;根据y像素值和u像素值,计算输出纹理图像的b通道值target.b,输出纹理图像的a通道值target.a自定义设置,向纹理图像显示模块发送纹理图像显示信号;

纹理图像显示模块用于:收到纹理图像显示信号后,控制gpu将target.r、target.g、target.b和target.a,赋值至纹理图像创建模块创建的a8r8g8b8格式的输出纹理图像。

与现有技术相比,本发明的优点在于:

本发明并未采用现有技术中通过cpu进行像素格式转换方法,而是根据hlsl语言(highlevelshaderlanguage,高阶着色器语言)结合自主研发的转换算法,在gpu(graphicsprocessingunit,图形处理器)上纹理图像的格式由i420转换为a8r8g8b8。因此,本发明能够通过gpu执行工作量最大的格式转换操作,显著降低了cpu的工作压力和系统内存,进而大幅度增大像素格式转换时的数据传输带宽,即缩短了像素格式转换的计算过程,提高了转换效率。

附图说明

图1为本发明实施例中i420格式纹理图像的转换方法的流程图;

图2为本发明实施例中电子设备的连接框图。

具体实施方式

以下结合附图及实施例对本发明作进一步详细说明。

参见图1所示,本发明实施例中的i420格式纹理图像的转换方法,包括以下步骤:

s1:定义需要转换的i420格式的纹理图像的宽度为w,高度为h,根据i420格式的纹理图像创建3幅像素格式相同(dxgi_format_r8_unorm,该格式为现有的像素格式)的输入纹理图像:py、pu和pv。py用于承载i420格式的纹理图像的y像素平面,py的宽度为w,高度为h;pu用于承载i420格式的纹理图像的u像素平面,pu的宽度为w/2,高度为h/2;pv用于承载i420格式的纹理图像的v像素平面,pv的宽度为w/2,高度为h/2,转到s2。

s2:根据i420格式的纹理图像,创建用于承载a8r8g8b8格式的输出纹理图像,输出纹理图像的像素格式为dxgi_format_b8g8r8a8_unorm,该格式为现有的像素格式,宽度为w,高度为h,转到s3。

s3:将py、pu和pv输入至gpu,gpu通过hlsl语言,确定py在坐标(i,j)处的y像素值、pu在坐标(i,j)处的u像素值、以及pv在坐标(i,j)处的v像素值;其中i和j均为归一化的浮点值(即i和j均大于等于0、且小于等于1),转到s4。

由于py、pu和pv的像素格式为dxgi_format_r8_unorm,因此y像素值、u像素值和v像素值均取r通道(红色通道)值。

s4:gpu通过hlsl语言计算s2中输出纹理图像的通道值:

根据y像素值和v像素值,计算输出纹理图像的r通道(红色通道)值target.r:

target.r=y+1.402·(v–0.5);

根据y像素值、v像素值和u像素值,计算输出纹理图像的g通道(绿色通道)值target.g:

target.g=y–0.344·(u–0.5)–0.714·(v–0.5);

根据y像素值和u像素值,计算输出纹理图像的b通道(蓝色通道)值target.b:

target.b=y+1.772(u–0.5),输出纹理图像的a通道(透明度)值target.a自定义设置,本实施例中为1.0,转到s5。

s4中的target.r、target.g和target.b均为自主研发的公式,公式中的各项参数(例如1.402,0.344,0.714等)能够保证将i420格式的纹理图像准确的转换为a8r8g8b8格式的纹理图像。

s5:gpu将target.r、target.g、target.b和target.a,赋值至s2中a8r8g8b8格式的的输出纹理图像。

参见s1至s5可知,本发明实施例并未采用现有技术中通过cpu进行像素格式转换方法,而是根据hlsl语言(highlevelshaderlanguage,高阶着色器语言)结合自主研发的转换算法,在gpu(graphicsprocessingunit,图形处理器)上纹理图像的格式由i420转换为a8r8g8b8。hlsl语言独立工作在windows平台上,只能供微软的direct3d使用,它是一种针对显卡进行编程的语言,最终由显卡进行执行。因此,本发明实施例能够通过gpu执行工作量最大的格式转换操作,显著降低了cpu的工作压力和系统内存,进而大幅度增大像素格式转换时的数据传输带宽,即缩短了像素格式转换的计算过程,提高了转换效率。

本发明实施例还提供一种存储介质,存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述i420格式纹理图像的转换方法。需要说明的是,所述存储介质包括u盘、移动硬盘、rom(read-onlymemory,只读存储器)、ram(randomaccessmemory,随机存取存储器)、磁碟或者光盘等各种可以存储程序代码的介质。

参见图2所示,本发明实施例还提供一种电子设备,包括存储器和处理器,存储器上储存有在处理器上运行的计算机程序,处理器执行计算机程序时实现上述i420格式纹理图像的转换方法。

本发明实施例提供的i420格式纹理图像的转换系统,包括纹理图像创建模块、像素格式转换模块和纹理图像显示模块。

纹理图像创建模块用于:根据需要转换的i420格式的纹理图像(宽度为w,高度为h),创建3幅像素格式相同(像素格式为dxgi_format_r8_unorm)的输入纹理图像:py(宽度为w,高度为h)、pu(宽度为w/2,高度为h/2)和pv(宽度为w/2,高度为h/2);py用于承载i420格式的纹理图像的y像素平面,pu用于承载i420格式的纹理图像的u像素平面,pv用于承载i420格式的纹理图像的v像素平面;根据i420格式的纹理图像,创建用于承载a8r8g8b8格式的输出纹理图像(像素格式为dxgi_format_b8g8r8a8_unorm,宽度为w,高度为h),向像素格式转换模块发送像素格式转换信号。

像素格式转换模块用于:

(1)收到像素格式转换信号后,将py、pu和pv输入至gpu;控制gpu通过hlsl语言,确定py在坐标(i,j)处的y像素值、pu在坐标(i,j)处的u像素值、以及pv在坐标(i,j)处的v像素值,i和j均为归一化的浮点值。

(2)根据y像素值和v像素值,计算输出纹理图像的r通道值target.r,target.r=y+1.402·(v–0.5);

根据y像素值、v像素值和u像素值,计算输出纹理图像的g通道值target.g,target.g=y–0.344·(u–0.5)–0.714·(v–0.5)

根据y像素值和u像素值,计算输出纹理图像的b通道值target.b,target.b=y+1.772(u–0.5),输出纹理图像的target.a=1.0,向纹理图像显示模块发送纹理图像显示信号。

纹理图像显示模块用于:收到纹理图像显示信号后,控制gpu将target.r、target.g、target.b和target.a,赋值至纹理图像创建模块创建的a8r8g8b8格式的输出纹理图像。

需要说明的是:本发明实施例提供的系统在进行模块间通信时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将系统的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。

进一步,本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1