VB实现RGB888到YUV422的转换

原创 2007年09月13日 16:50:00

从前面的bmp文件格式以及YUV的格式介绍中,我们已经知道了两种文件之间的差异。再从网上找到YUV与RGB之间的换算关系:

Y =   0.257R + 0.504G + 0.098B + 16
U = -0.148R - 0.291G + 0.439B + 128
V  =  0.439R - 0.368G - 0.071B + 128

 好,现在准备工作已经差不多了。需要的就是整理一下思路了。               

目的:将RGB888文件(即24位bmp) 转换为 YUV422(UYVY)

过程:RGB888  =》 YUV  =》 YUV422    (注:中间的YUV就是按照上面的公式进行RGB到YUV的转换,但是格式上还不是YUV格式,所以还需要再次转换成YUV422。)

好,下面就可以累长城了。

RGB到YUV转换的代码如下:


        Open strRGBfile For Binary As #1
        Open strYUVfile For Binary As #100
        
        'BMP 54个字节之后的是像素数据
        lengRGB = rgbHeight * rgbWidth * 3

        ReDim rgbContent(lengRGB - 1) '重定义数组,为读取文件做准备
        Get #1, 55, rgbContent() '取得第一文件的内容到数组
        Dim i, j As Long
        Dim r, g, b As Integer
        ReDim yuvContent(lengRGB - 1)

        For i = 0 To rgbHeight - 1
            For j = 0 To rgbWidth - 1
                b = rgbContent(3 * (rgbWidth * i + j) + 0)
                g = rgbContent(3 * (rgbWidth * i + j) + 1)
                r = rgbContent(3 * (rgbWidth * i + j) + 2)
                yuvContent(3 * (rgbWidth * (rgbHeight - 1 - i) + j)) = 0.257 * r + 0.504 * g + 0.098 * b + 16
                yuvContent(3 * (rgbWidth * (rgbHeight - 1 - i) + j) + 1) = -0.148 * r - 0.291 * g + 0.439 * b + 128
                yuvContent(3 * (rgbWidth * (rgbHeight - 1 - i) + j) + 2) = 0.439 * r - 0.368 * g - 0.071 * b + 128
            Next j
        Next i
        close #1     
        close #100

已经将RGB数据完全转变为YUV的格式了,再就是转变为YUV422(UYVY),代码如下:


        Open strYUVfile For Binary As #100
        Dim j As Long
        ReDim yuv422Content((lengRGB + 1) * 4 / 6 - 2)

        For j = 0 To (lengRGB / 6 - 1) 'UYVY
            yuv422Content(4 * j + 0) = Temp_yuvContent(6 * j + 1) / 2 + yuvContent(6 * j + 4) / 2  'U0
            yuv422Content(4 * j + 1) = Temp_yuvContent(6 * j)                                                            'Y0
            yuv422Content(4 * j + 2) = Temp_yuvContent(6 * j + 2) / 2 + yuvContent(6 * j + 5) / 2  'V0
            yuv422Content(4 * j + 3) = Temp_yuvContent(6 * j + 3)                                                      'Y1
        Next j
       
        Put #100, , yuv422Content() '把yuv的内容写到yuv444件中
        yuvlen = (lengRGB + 1) * 4 / 6 - 1
        SavetoCfunction
        '关闭文件
        Close #100
        MsgBox "完成。", vbInformation

这时候我们就完成任务了,YUV422的数据已经被写入了文件中。

要是有什么问题请及时与我联系!

下面show下我写的小软件吧:

已经实现的功能:

RGB888 =》YUV444

RGB888 =》YUV422(UYVY)

RGB888 =》YUV420 (YV12)

RGB888 =》YUV411 (YUYYVY)

YUV444          =》RGB888

YUV422(UYVY)  =》RGB888

YUV420 (YV12)   =》RGB888

YUV411 (YUYYVY) =》RGB888

剩下的格式还没有空去做,不过会做一个了另一个就简单多了。剩下的等以后有时间了再做吧!

版权声明:本文为博主原创文章,未经博主允许不得转载。

uyvy422到RGB888转换

在嵌入式系统中由于摄像头彩集出来的数据一般会采用YUV的格式,但是framebuffer一般只接收RGB的数据,因此需要YUV到RGB颜色空间的转换。 YUV到RGB的转换思路一般是提到Y,U,V分...
  • BYD123
  • BYD123
  • 2012年08月13日 20:20
  • 2491

YUV420到RGB888的转换类

  • 2012年05月18日 18:25
  • 4KB
  • 下载

sw_scale中实现yuv420转rgb888——neon汇编优化

在全志a31s上 使用ffmpeg库中sw_scale转换格式yuv4202rgbx888时,1920x1080的转换耗时有50多ms,渲染50多ms,实际效果无法达到声音视频同步。后在网上找到neo...
  • iisktz
  • iisktz
  • 2015年01月01日 23:39
  • 628

YUV422P、YV16、NV16、NV61格式转换成RGB24

YUV422有打包格式(Packed),一如前文所述。同时还有平面格式(Planar),即Y、U、V是分开存储的,每个分量占一块地方,其中Y为width*height,而U、V合占width*heig...

YUV422与RGB互相转换

转自: http://m.blog.csdn.net/blog/guo8113/25333837#   前一段时间在DM8168中进行颜色空间的转换,在网上找了些程序,自己也根据网上的改了下,由于...

YUV422转BGR888(海思3516平台)

#include "hi_comm_ive.h" #include "mpi_ive.h" #pragma pack(1) typedef struct{ short type...
  • cjsycyl
  • cjsycyl
  • 2013年03月15日 09:14
  • 3273

YUV420、YUV422、RGB24转换

//平面YUV422转平面RGB24static void YUV422p_to_RGB24(unsigned char *yuv422[3], unsigned char *rgb24, int w...

YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24

对于YUV422的格式,网上有一大堆资料,这里就不说了。直奔主题,给出如何转换的函数,一如既往,只用代码说事。...
  • subfate
  • subfate
  • 2015年08月05日 22:23
  • 3034

YUV422 YUV420 RGB24相互转换

直接上可用的代码

YUV422转RGB

  • 2013年06月25日 11:15
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB实现RGB888到YUV422的转换
举报原因:
原因补充:

(最多只允许输入30个字)