求JPEG格式图片转换为BMP格式的VB代码
小女子求JPEG格式图片转换为BMP格式的VB代码,不希望有第三方控件,不知道有没有大侠知道,急用,谢谢帮忙了。
[解决办法]
VB本身就有自带的
Private Sub Command1_Click()
Picture1.Picture = LoadPicture("c:\test.jpg")
SavePicture Picture1.Picture, "c:\test.bmp"
End Sub
[解决办法]
对于摄像头的捕获通常分为两种:
1、是采用 DirectShow 的方式进行处理。
2、是通过 VFW 的方式进行处理。
在 VB 中,通常都是试用 VFW 的方式进行处理。因为 DirectShow 虽然也是
以 COM 的方式为接口,不过有些类或处理方式对于VB的支持还是在不那么好,
因为他标准的支持是 VC,所以 DirectShow 对于捕获设备这一块的处理就不考
虑了。既然是 VFW 中做摄像头的捕获,那么有两种方式可以处理:
1、捕获屏幕上显示的摄像头图像
2、从捕获函数接口中取得传过来的数据指针来分析捕获帧的图像数据
从屏幕上捕获图像,方法很简单,直接用一些基本的 GDI 函数就可以处理。
从捕获的函数接口中取得图像数据的方式,很多是根据色彩系统来分析数据的。
比如RGB色彩系统,他返回的就是 R\G\B 的方式,从左到右,从上至下的方式
,以R\G\B 的数据返回到 capSetCallbackOnFrame 设定函数指针的 LPVIDEOHDR
结构中。
目前市场上大多数的那种免驱动的摄像头都是 YUY2 色彩系统的。
无论他的传输层如何,到了驱动层,系统会以色彩系统的数据方式反馈到你的
LPVIDEOHDR 结构中的 lpData 指针里。
所以,通常只需要了解到色彩系统,就可以讲数据转换并重现出来。
对于YUY2色彩系统与RGB色彩系统的原理是这样的:
其实YUY2也是YUV色彩系统。但是 YUV 是用3个字节并表示一个点色彩的,但
YUY2 是以 4 个字节表示两个色彩点,这样无形中就每两个色彩就节约了两个
字节的数据量。
YUY2的取值是这样的:
Y0 = Byte1
U = Byte2
Y1 = Byte3
V = Byte4
具体的处理过程和计算公式可以这样处理
//......
YUVBytesX = x * (LONG)lpYUY2ColorSize;
YUVBytesY = y * YUY2ByteWidthSize;
cY0 = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 0];
cU = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 1];
cY1 = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 2];
cV = (LONG)lpYUY2Bytes[YUVBytesY + YUVBytesX + 3] ;
cY0 = cY0 - (LONG)16;
cY1 = cY1 - (LONG)16;
cU = cU - (LONG)128;
cV = cV - (LONG)128;
if(cY0>(LONG)255){ cY0=(LONG)255; }else if(cY0<(LONG)0){ cY0=(LONG)0; }
if(cY1>(LONG)255){ cY1=(LONG)255; }else if(cY1<(LONG)0){ cY1=(LONG)0; }
ColorR1 = (LONG)((cY0 * (LONG)298 + cV * (LONG)409 + (LONG)128)>>(LONG)8);
ColorG1 = (LONG)((cY0 * (LONG)298 - cU * (LONG)100 - cV * (LONG)208 + (LONG)128)>>(LONG)8);
ColorB1 = (LONG)((cY0 * (LONG)298 + cU * (LONG)516 + (LONG)128)>>(LONG)8);
ColorR2 = (LONG)((cY1 * (LONG)298 + cV * (LONG)409 + (LONG)128)>>(LONG)8);
ColorG2 = (LONG)((cY1 * (LONG)298 - cU * (LONG)100 - cV * (LONG)208 + (LONG)128)>>(LONG)8);
ColorB2 = (LONG)((cY1 * (LONG)298 + cU * (LONG)516 + (LONG)128)>>(LONG)8);
//......