用VC++代码怎样实现图像网络传送?(注意:不是图片而是图像)

用VC++代码怎样实现图像网络传送?(注意:不是图片而是图像),第1张

本问介绍了GDI+支持的大多数图像文件格式,以及GDI+提供的处理图像的文件的两个类:Image和Bitmap我们知道,在以往的图像处理中,常常要根据不同图像文件的格式及其数据存储结构在不同格式中进行转换。某个图像文件的显示也是依靠对文件数据结构的剖析,然后读取相关图像数据而实现的。现在,GDI+提供了Image和Bitmap类使我们能轻松容易地处理图像。概述GDI+支持大多数流行的图像文件格式,如BMP、GIF、JPEG、TIFF和PNG等。下面先来介绍这些图像文件,然后再说明Image和Bitmap类支持的特性。1.图像文件格式简介图像文件是描穗睁绘一幅图像的计算机磁盘文件,其文件格式不下数十种。这里仅介绍BMP、GIF、JPEG、TIFF和PNG等图像文件格式。BMP文件格式BMP图像文件格式是Microsoft为其Windows环境设置的标准图像格式。一个Windows的BMP位图实际上是一些和显示像素相对应的位凯族慧阵列,它有两种类型:一种称之为GDI位图,另一种是DIB位图(Device-IndependentBitmap)。GDI位图包含了一种和Windows的GDI模块有关的Windows数据结构,该数据结构是与设备有关的,故此位图又称为DDB位图(Device-DependentBitmap)。当用户的程序取得位图数据信息时,其位图显示方式视显示卡而定。由于GDI位图的这种设备依赖性,当位图通过网络传送到另一台PC,很可能就会出现问题。DIB比GDI位图有很多编程优势,例如它自带颜色信息,从而使调色板管理更加容易。且任何运行Windows的机器都可以处理DIB,并通常以后缀为.BMP的文件形式被保存在磁盘中或作为资源存在于程序的EXE或DLL文件中。GIF文件格式图形交换格式(GIF--GraphicsInterchangeFormat)最早由CompuServe公司于1987年6月15日制定的标准,主要用于CompuServe网络图形数据的在线传输、存储。GIF提供了足够的信息并很好地组织了这些信息,使得许多不同的输入输出设备能够方便地交换图像,它支持24位彩色,由一个最多256种颜色的调色板实现,图像的大小最多是64Kx64K个像点。GIF的特点是LZW压缩、多图像和交错屏幕绘图。JPEG文件格式国际标准化组织(ISO)和国际电报盯答电话咨询委员会(CCITT)联合成立的"联合照片专家组"JPEG(JointPhotographicExpertsGroup)经过五年艰苦细致工作后,于1991年3月提出了ISOCD10918号建议草案:"多灰度静止图像的数字压缩编码"(通常简称为JPEG标准)。这是一个适用于彩色和单色多灰度或连续色调静止数字图像的压缩标准。它包括无损压缩和基于离散余弦变换和Huffman编码的有损压缩两个部分。前者不会产生失真,但压缩比很小;后一种算法进行图像压缩时,信息虽有损失但压缩比可以很大。例如压缩20~40倍时,人眼基本上看不出失真。JPEG图像文件也是一种像素格式的文件格式,但它比BMP等图像文件要复杂许多。所幸的是,GDI+的Image提供了对JPEG文件格式的支持,使得我们不需要对JPEG格式有太多的了解就能处理该格式的图像。TIFF文件格式TIFF(TaggedImageFormatFile,标志图像文件格式)最早由Aldus公司于1986年推出的,它能对从单色到24位真彩的任何图像都有很好的支持,而且在不同的平台之间的修改和转换是十分容易的。与其它图像文件格式不同的是,TIFF文件中有一个标记信息区用来定义文件存储的图像数据类型、颜色和压缩方法。PNG文件格式PNG(PortableNetworkGraphic,可移植的网络图像)文件格式是由ThomasBoutell、TomLane等人提出并设计的,它是为了适应网络数据传输而设计的一种图像文件格式,用于取代格式较为简单、专利限制严格的GIF图像文件格式。而且,这种图像文件格式在某种程度上甚至还可以取代格式比较复杂的TIFF图像文件格式。它的特点主要有:压缩效率通常比GIF要高、提供Alpha通道控制图像的透明度、支持Gamma校正机制用来调整图像的亮度等。需要说明的是,PNG文件格式支持三种主要的图像类型:真彩色图像、灰度级图像以及颜色索引数据图像。JPEG只支持前两种图像类型,而GIF虽然可以利用灰度调色板补偿图像的灰度级别,但原则上它仅仅支持第三种图像类型。mage和Bitmap类概述GDI+的Image类封装了对BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和EMF(增强WMF)图像文件的调入、格式转换以及简单处理的功能。而Bitmap是从Image类继承的一个图像类,它封装了Windows位图 *** 作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分别用来对位图进行读写像素 *** 作,从而可以为图像的柔化和锐化处理提供一种可能。3.DrawImage方法DrawImage是GDI+的Graphics类显示图像的核心方法,它的重载函数有许多个。常用的一般重载函数有:StatusDrawImage(Image*image,INTx,INTy)StatusDrawImage(Image*image,constRect&rect)StatusDrawImage(Image*image,constPoint*destPoints,INTcount)StatusDrawImage(Image*image,INTx,INTy,INTsrcx,INTsrcy,INTsrcwidth,INTsrcheight,UnitsrcUnit)其中,(x,y)用来指定图像image显示的位置,这个位置和image图像的左上角点相对应。rect用来指定被图像填充的矩形区域,destPoints和count分别用来指定一个多边形的顶点和顶点个数。若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点坐标。srcx、srcy、srcwidth和srcheight用来指定要显示的源图像的位置和大小,srcUnit用来指定所使用的单位,默认时使用PageUnitPixel,即用像素作为度量单位。调用和显示图像文件在GDI+中调用和显示图像文件是非常容易的,一般先通过Image或Bitmap调入一个图像文件构造一个对象,然后调用Graphics::DrawImage方法在指定位置处显示全部或部分图像。例如下面的代码:voidCEx_GDIPlusView::OnDraw(CDC*pDC){CEx_GDIPlusDoc*pDoc=GetDocument()ASSERT_VALID(pDoc)usingnamespaceGdiplusGraphicsgraphics(pDC->m_hDC)Imageimage(L"sunflower.jpg")graphics.DrawImage(&image,10,10)Rectrect(130,10,image.GetWidth(),image.GetHeight())graphics.DrawImage(&image,rect)}结果如图7.17所示,从图中我们可以看出,两次DrawImage的结果是不同的,按理应该相同,这是怎么一回事?原来,DrawImage在不指定显示区域大小时会自动根据设备分辨率进行缩放,从而造成显示结果的不同。当然,也可以使用Bitmap类来调入图像文件来构造一个Bitmap对象,其结果也是一样的。例如,上述代码可改为:Bitmapbmp(L"sunflower.jpg")graphics.DrawImage(&bmp,10,10)Rectrect(130,10,bmp.GetWidth(),bmp.GetHeight())graphics.DrawImage(&bmp,rect)需要说明的是,Image还提供GetThumbnailImage的方法用来获得一个缩略图的指针,调用DrawImage后可将该缩略图显示,这在图像预览时极其有用。例如下面的代码:Graphicsgraphics(pDC->m_hDC)Imageimage(L"sunflower.jpg")Image*pThumbnail=image.GetThumbnailImage(50,50,NULL,NULL)//显示缩略图graphics.DrawImage(pThumbnail,20,20)//使用后,不要忘记删除该缩略图指针deletepThumbnail图像旋转和拉伸图像的旋转和拉伸通常是通过在DrawImage中指定destPoints参数来实现,destPoints包含对新的坐标系定义的点的数据。图7.18说明了坐标系定义的方法。从图中可以看出,destPoints中的第一个点是用来定义坐标原点的,第二点用来定义X轴的方法和图像X方向的大小,第三个是用来定义Y轴的方法和图像Y方向的大小。若destPoints定义的新坐标系中两轴方向不垂直,就能达到图像拉伸的效果。下面的代码就是图像旋转和拉伸的一个示例,其结果如图7.19所示。Imageimage(L"sunflower.jpg")graphics.DrawImage(&image,10,10)Pointpoints[]={Point(0,0),Point(image.GetWidth(),0),Point(0,image.GetHeight())}Matrixmatrix(1,0,0,1,230,10)//定义一个单位矩阵,坐标原点在(230,10)matrix.Rotate(30)//顺时针旋转30度matrix.Scale(0.63,0.6)//X和Y方向分别乘以0.63和0.6比例因子matrix.TransformPoints(points,3)//用该矩阵转换pointsgraphics.DrawImage(&image,points,3)Pointnewpoints[]={Point(450,10),Point(510,60),Point(350,80)}graphics.DrawImage(&image,newpoints,3)当然,对于图像旋转还可直接使用Graphics::RotateTransform来进行,例如下面的代码。但这样设置后,以后所有的绘图结果均会旋转,有时可能感觉不方便。Imageimage(L"sunflower.jpg")graphics.TranslateTransform(230,10)//将原点移动到(230,10)graphics.RotateTransform(30)//顺时针旋转30度graphics.DrawImage(&image,0,0)调整插补算法的质量当图像进行缩放时,需要对图像像素进行插补,不同的插补算法其效果是不一样的。Graphics::SetInterpolationMode可以让我们根据自己的需要使用不同质量效果的插补算法。当然,质量越高,其渲染时间越长。下面的代码就是使用不同质量效果的插补算法模式,其结果如图7.20所示。Graphicsgraphics(pDC->m_hDC)Imageimage(L"log.gif")UINTwidth=image.GetWidth()UINTheight=image.GetHeight()//不进行缩放graphics.DrawImage(&image,10,10)//使用低质量的插补算法graphics.SetInterpolationMode(InterpolationModeNearestNeighbor)graphics.DrawImage(&image,Rect(170,30,(INT)(0.6*width),(INT)(0.6*height)))//使用中等质量的插补算法graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear)graphics.DrawImage(&image,Rect(270,30,(INT)(0.6*width),(INT)(0.6*height)))//使用高质量的插补算法graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic)graphics.DrawImage(&image,Rect(370,30,(INT)(0.6*width),(INT)(0.6*height)))事实上,Image功能还不止这些,例如还有不同格式文件之间的转换等。但这些功能和MFC的新类CImage功能基本一样,但CImage更符合MFC程序员的编程习惯,因此下一节中我们来重点介绍CImage的使用方法和技巧。

用SOCKET发送图片数据,数据可以放在一个结构里,像这样一样

#pragma

pack(push,1)

typedef

struct

{

short

flags

int

len

BYTE

szBuffer[256]

}PICTURE,*PPICTURE

#pragma

pack(pop)

发送这样的数穗芦据结构,接收方获得后可以判断flags.

可以设flags为1时是图片数据,len是数据长度

flags为2时表示数据发送完毕,

flags为0时表示请求图片数据,szBuffer为图片乱州名........等等等等,

通过SOCKET的TCP协议传诵哗族蔽,没问题了.


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8228692.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存