本发明公开一种加快图片渐变速度的方法,涉及图片处理技术领域,具体地说是一种基于sse4指令集加快图片渐变速度的方法。
背景技术:
在软件制作的过程中,图片元素必不可少。为插入的素材图像添加淡入和淡出,可以产生若隐若现的效果,从而可以使静态的图像产生动态的效果,使整个软件更加生动、形象。本发明提供一种基于sse4指令集加快图片渐变速度的方法,使用了java语言实现了图片的渐变,并且在java代码环境下使用sse4指令集加快了图片的融合处理速度,从而解决了在java代码环境下,图片切换过程中,如何在图片切换过程中是切换速度加快的问题。
jni技术,它允许java语言代码和其他语言代码进行交互。
技术实现要素:
本发明针对现有技术的问题,提供一种基于sse4指令集加快图片渐变速度的方法,从而加快了图片的渐变效果,提供可视化处理过程,具有一定的推广意义。
本发明提出的具体方案是:
一种基于sse4指令集加快图片渐变速度的方法:
java利用bufferedimage对象获得图片像素信息,再调用c++的sse4指令集加快分析计算图片像素信息,java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速。
所述的方法中java利用bufferedimage对象将图片像素信息存储在int类型的一维数组中,再调用c++的sse4指令集加快分析计算一维数组,将分析计算结果返回给java的bufferedimage对象,java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速。
所述的方法中java利用jni对c++进行调用,获得一维数组的指针和长度变量,将sse4指令集寄存器初始化,利用sse4指令集寄存器分析计算图片像素信息的一维数组,再利用c++生成动态连接库,将生成的dll文件放在java中。
所述的方法中具体步骤为:
java对c++使用的本地方法进行声明,
得到指向图片像素信息的一维数组的指针和一维数组的长度变量,
将sse4指令集寄存器初始化并置为0,
将一维数组分组,利用sse4指令集寄存器进行分析计算,
再利用c++生成动态连接库,将生成的dll文件放在java中。
所述的方法中一维数组的长度若为偶数,则一维数组分组后,数据为整型,sse4指令集寄存器执行整型的分析计算,
一维数组的长度若为奇数,则一维数组分组后,sse4指令集寄存器除分析计算整型外,还单独分析计算剩余奇数像素。
在一维数组分组后,sse4指令集寄存器采用加权平均算法进行sse4指令中的数据与一维数组中图片像素信息的数据的分析计算。
一种基于sse4指令集加快图片渐变速度的装置,利用java的bufferedimage对象获得图片像素信息,再利用java调用c++的sse4指令集加快分析计算图片像素信息,然后利用java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速。
所述的装置中利用java的bufferedimage对象将图片像素信息存储在int类型的一维数组中,再利用java调用c++的sse4指令集加快分析计算一维数组,将分析计算结果返回给java的bufferedimage对象,然后利用java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速。
所述的装置中java利用jni对c++进行调用,获得一维数组的指针和长度变量,将sse4指令集寄存器初始化,利用sse4指令集寄存器分析计算图片像素信息的一维数组,再利用c++生成动态连接库,将生成的dll文件放在java中。
本发明的有益之处是:
本发明提供一种基于sse4指令集加快图片渐变速度的方法,java利用bufferedimage对象获得图片像素信息,再调用c++的sse4指令集加快分析计算图片像素信息,java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速;利用本发明方法将java调用sse4指令集,加快分析计算图片像素信息,实现图片渐变加速,并且可进行可视化处理过程,具有推广意义。
附图说明
图1是实施例1中的图片1;
图2是实施例1中的图片2;
图3和图4是实施例1中图片2向图片1渐变过程的图片;
图5是实施例1中图片2向图片1渐变的最终结果图片;
图6是本发明方法流程示意图。
具体实施方式
本发明提供一种基于sse4指令集加快图片渐变速度的方法,java利用bufferedimage对象获得图片像素信息,再调用c++的sse4指令集加快分析计算图片像素信息,java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速。
同时提供与上述方法相对应的一种基于sse4指令集加快图片渐变速度的装置,利用java的bufferedimage对象获得图片像素信息,再利用java调用c++的sse4指令集加快分析计算图片像素信息,然后利用java根据图片像素信息的分析计算结果,进行图片的刷新,实现图片渐变加速。
下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定。
图像融合是两幅图像的颜色分量对应融合,两幅图像通过加权平均算法进行融合。根据计算公式,在因子逐渐变化的过程中,产生一系列融合的中间图像,实现了由一个图像渐变到另一图像的过程。
实施例1
利用本发明方法和装置,对图片2渐变为图片1进行说明。
本发明方法中java利用bufferedimage对象将图片像素信息存储在int类型的一维数组中,图片的每个像素包括三个颜色分量:r(红)、g(绿)、b(蓝)和透明度,1个字节可恰好存储像素信息中r、g、b或者透明度的信息,4个共占32位,与1个int类型所占字节完全相同,即1个int类型可以存储一个像素的信息;
java利用jni调用c++的sse4指令集加快分析计算一维数组,获得一维数组的指针和长度变量,数组的长度为像素的宽度乘以像素的高度,
其中java利用jni调用c++使用的sse4的指令集,
将128位型sse4指令集寄存器初始化并置为0,sse4指令中的128位数据,可以分成4个32位的数据,将4个32位数据分成8个16位数据,可由128位型sse寄存器实现,
判断存储图片2的像素信息的一维数组长度为偶数,则执行将两个32位整数每8位一组,128位型sse4指令集寄存器利用加权平均算法进行sse4指令中的数据与一维数组中图片像素信息的数据的分析计算,加权平均算法的计算公式为:
result_pixel=a_pixel×fade+b_pixel×(1-fade)
变换后得:
result_pixel=(a_pixel-b_pixel)×fade+b_pixel
fade因子从1逐渐变为0的过程中,产生一系列中间图像,实现了由a图片渐变到b图片的过程,
具体计算过程为:将像素信息的数据中每一个rgb和透明度中的byte信息位解压缩存放在16位的sse4指令数据中,与一个从0到255逐渐增1的byte位相乘,将这8个16位sse4指令数据并行从左向右移动8位,进行紧缩,计算了低64位中的数据,即计算了2个整型int类型的数据,继续计算直至完成,如此不仅不会造成数据的溢出及异常,还以sse4指令集寄存器的右移方法代替了乘法,使运行速度有了较大提高,
判断存储图片2的像素信息的一维数组长度为奇数,除与像素信息的一维数组长度为偶数时相同外,还需要单独分析计算剩余的一个像素;
再利用c++生成动态连接库,将生成的dll文件放在java中,将计算结果返回给java的bufferedimage对象,java通过对jpanel的重绘技术,进行图片的刷新,实现图片2渐变到图片1的加速。
在上述实施例中,利用bufferedimage对象将图片像素信息存储在int类型的一维数组中,主要java代码如下:
在上述实施例中,将计算结果返回给java的bufferedimage对象,主要java代码如下:
在上述实施例中,可以循环显示图片2渐变为图片1的中间图片,主要java代码如下:
使用sse4指令集,通过分析计算过程,主要代码如下:
以上实施例中,利用java运行流程为:
在命令行中编译该java文件,生成myframe.class;
使用javahmyframe命令,生成myframe.h头文件;
把myframe.h头文件导入建立的c++工作空间的头文件类库中,实现头文件中的jniexportjintarrayjnicall;
java_com_inspur_myframe_showpicture(jnienv*,jobject,jintarray,jintarray,jint)方法。
参考附图1-5,对使用sse4指令和不使用sse4指令中进行比较,使用现有java编写的图片渐变切换时间是32167ms,使用本发明方法的图片渐变切换时间是31168ms,像素为1920*1200的图片使用sse4指令可以优化大约1秒左右,如上所示,数据差异非常可观,本发明方法还可应用在浮点运算、3d运算、视频处理、音频处理等诸多多媒体领域。
以上所述实施例仅是为充分说明本发明而所举的较佳的实施例,本发明的保护范围不限于此。本技术领域的技术人员在本发明基础上所作的等同替代或变换,均在本发明的保护范围之内。本发明的保护范围以权利要求书为准。