田东燊,李思军,孙旭飞
(福州大学 物理与信息工程学院,福建 福州 350108)
近年来,随着拍照类数码产品飞速的发展,小到人们手中的拍照手机,大到数码相机所配置的摄像头像素越来越大,拍摄的作品也越来越清晰美观,但由此导致了图片大小也越来越大。人们常爱把所拍的美丽图片分享到朋友圈以供他人浏览,以往当我们点开网上一张图片时,系统会先将图像从服务端下载到客户端才能显示出来,或者图像由上向下扫描式显示。但当我们身处深山或者局部网络繁忙的环境中时,想要再去浏览高清图片势必十分困难。原有的图像传输方式大大降低用户浏览图片的体验度。而采用渐进式图像传输,当人们点开想要查看的图片时,系统能第一时间将原始图像大致的轮廓数据从服务器传输到客户端并显示出来,人们可以在极短时间内根据看到的模糊图像获得当前图像的大致信息,从而选择是否等待查看原始图像。采用渐进式图像传输,也能大大降低图像在网络中传输对带宽的需求。
本设计采用基于TCP协议的Socket网络编程的原理,在Linux平台搭建了服务器Windows平台搭建了客户端[1],实现了图像传输以及图像在客户端由模糊到清晰的显示。
渐进式图像传输是通过对目标图像采用特殊方式的编码来实现的。目前渐进式传输的方法大致分为三类,塔型编码、迭代编码以及频率选择编码。
塔型编码将一副图像像塔一样分成数层来表示,不同的层对应不同的分辨率,其中最顶层图像分辨率最低,最底层图像的分辨率最高且和原始图像分辨率相同。一般下一层分辨率是上一层分辨率的四倍;迭代编码是通过迭代编码残差图像来得到增强层数据的;频率选择编码是在图像频率域进行处理的一种方法。常采用8×8 DCT(离散余弦变换)完成空间域到频率的转换。DCT系数的每个分量对应一定的能量。左上角为低频分量,记录着图像大致轮廓数据。右下角为高频分量记录着相应图像具体细节。在图像传输时先传输低频分量再传输高频分量从而达到渐进式传输效果[2]。
本次设计使用的是Libjpeg图像处理库对位图进行压缩处理,该库编码类型即为频率选择编码。其编码器构成如图1所示。
图1 于DCT的JPEG编码器构成
如图1所示编码器原理为先将原始图像数据分割成许多8×8的数据单元,然后通过DCT处理将相应的数据单元的值转换成对应的频率系数。然后通过量化处理并使用哈夫曼编码进行熵编码最终得到压缩图像数据[3]。
利用Libjpeg库进行渐进式压缩的具体实现过程如下:
将位图数据读入到内存中,判断出图像是24位还是32位色彩深度位图(位图色彩深度有多种,在此只处理了24位和32位的位图);通过struct jpeg_compress_struct cinfo和jpeg_create_compress (&cinfo)申请初始化一个jpeg压缩对象;通过jpeg_stdio_dest(&cinfo, fJpeg)指定压缩后的jpg图像所存放的目标文件;设置24位和32位位图相应的压缩参数; 使用jpeg_create_compress (&cinfo)开启压缩; 最后释放压缩过程申请的资源。
通过上述处理,服务器端将大型位图压缩成小型的渐进式jpg图像。成功减少了传输数据。本系统采用的是Socket套接字技术对数据进行传输。采用的传输协议是TCP/IP协议,其通信实现步骤主要包含:服务端创建套接字,通过bind()函数绑定套接字和端口号,然后通过listen()函数开启监听功能。客户端使用connect()函数连接服务器指定的相应端口号。连接成功后服务端和客户端使用recv()函数和send()函数进行相互间的数据接收与发送[4-5]。
目前图片传输技术在web网页得到广泛的应用,其传输原理是当用户点击一张想要查的图片时,系统先将一张低分辨率的图片按比例放大得到一张模糊图片,然后将原始图片传输过来。当放大比例过大时,得到的放大图片十分模糊,不能第一时间让用户得到的可靠信息,而图片数据分片实时传输的方式却能解决上述问题。
本次设计需要自行搭建Linux服务器和Windows客户端。Linux系统选用Ubuntu16.04.1 LTS 64 bit版本。因服务端使用到Libjpeg库故需要进行相关配置,首先从网上下载libjpeg-turbo-1.2.1.tar.gz安装包并解压,然后使用make命令对其进行编译生成静态库,最后将生成的库文件移动到相应的目录下。Windows客户端选用的Visio studio 2012版本作为开发平台,并将OpenCV2.4.9版本库添加到开发环境中。
系统实现了用户在客户端输入想要浏览的图片编号将其发送到服务器端,服务器端收到请求后将存储的相应位图进行频率选择编码压缩得到一张数据量小的jpg图片,压缩后得到的图片大小受压缩质量参数的影响。在压缩图像前需要对位图判断其为正向位图还是倒向位图,并做相应的位图数据存取顺序处理。系统通过Socket套接字将压缩后的图片数据分成8次在相等的时间间隔依次发送到Windows客户端。客户端使用OpenCV库将接收到的图片数据依次显示出来,从而实现图片显示由模糊到清晰的过程。上述方式也大大降低了图像传输的数据。服务端和客户端系统流程图如图2所示。
图2 系统流程图
本系统分别对24位和32位位图进行了相关的实验并取得了成功。从下图3可以看出,服务端名为test.bmp的32位原始位图大小为2.8 MB:
图3 服务器界面
首先服务端使用./server命令运行服务程序从而开启服务器监听功能,如图4所示。
图4 服务器运行界面
然后Windows客户端运行相应程序,输入用户需要浏览的图像并尝试连接到服务端,如图5所示。
图5 客户端运行界面
服务端在收到客户端相应请求后将相应的位图(本次实验位图名为test.bmp)进行编码压缩成为名为bmptojpg.jpg的图片,结果如图6所示。可以看出,压缩后的图片大小为400 KB,其远远小于原始的位图的2.8 MB。故当系统将图片从服务端传输到客户端时,需要传输的数据被极大的降低。
图6 服务器运行后的结果
图片压缩时采用的是渐进式传输技术。因此在图像数据分次被传输到客户端时,客户端能够将接收到的数据依次拼接起来逐次显示在屏幕上,从而在用户浏览图片时,能够感觉到图像由模糊到清晰的过程。在Linux服务端压缩后得到的jpg图像数据被分成8次传输,客户端程序不仅将接收到的数据依次拼接成8张图片显示出来,还将这8张图片存储在了Windows端的磁盘上以供分析使用,8张图片如7所示。
图7 编码压缩所得图片显示效果
可以看出上图8中由a图到h图其清晰程度越来越高。通过实验发现,当传输的数据达到所传输图片全部数据的50%时,图片清晰度已经十分接近原始位图清晰度,由此可见一张2.8 MB的位图通过系统的处理后只需实时传输200 KB的数据就能让用户在客户端看到与原始位图相差无几的图像。而且由于图像数据分次逐次实时传输,使得客户端能够实时的显示,与目前web网页的图像传输技术相比较,本系统的处理方法大大提高了用户浏览图片的体验度,也大大降低系统每次传输图像数据的大小。显然这样的图像传输系统在网络带宽较低或者网络繁忙的环境中也有着较强的适应能力。系统最终实现结果如图8所示。
图8 运行结果
本文研究了在有限的带宽下如何实现大型图像的传输与显示。实验以Linux平台作为服务端,Windows平台作为客户端。通过使用套接字网络编程技术实现了服务器客户端间的通信。并且通过对原始图像采用渐进式传输技术,通过对图像的压缩、分步式数据传输、拼接接收到的图像数据、刷新显示图像,使得客户端的图像显示实现了由模糊到清晰的显示过程,用户能第一时间了解到所看图片的大致轮廓信息,同时服务器客户端间传输的数据也大大降低,达到了预期目的。