NUKE:
nuke的图像数据保存在channel中,我们只需要用到其中的r,g,b三个channel。这三个channel是相互独立的,可以分别从中读取数据,每一次可以读取图像的一行像素。这样看来,最合理的线性存储方式就是每个channel的数据作为一组来保存,即:RRRR...RRRRGGGG...GGGGBBBB...BBBB的形似。
FFMPEG:
ffmpeg支持的编码比较多,如果按照像素格式来分,主要有两类,一类是是RGB,另一类是YUV。对于影像类编码,比如xvid/mpeg4之类,颜色模式只能是YUV,甚至仅仅支持yuv420p这一种。因为要考虑到与nuke相结合,这里只看rgb像素格式中的rgb24。rgb24的线性格式为:RRRR...RRRRGGGG...GGGGBBBB...BBBB,可以很方便的和nuke中的channel数据结合。
ffmpeg提供了一个函数可以在各种像素格式之间转换。yuv420p的Cr和Cb分量只有Y分量大小的一半,因此需要的空间只有rgb24的2/3。
libquicktime:
libquicktime中没有与上面RGB24一致的原始rgb格式,有一种rgb888格式。其线性格式为:RGBRGBRGB...。libquicktime在保存帧的时候也要先将rgb转换为yuv,不过这个过程是自动完成的。
从rgb24到rgb888的转换:
pFrameBufferLinear[y*w*3+3*x] = pFrameRGB_r[Y*w+i]; //R
pFrameBufferLinear[y*w*3+3*x+1] = pFrameRGB_g[Y*w+i]; //G
pFrameBufferLinear[y*w*3+3*x+2] = pFrameRGB_b[Y*w+i]; //B
2007年4月23日星期一
订阅:
博文评论 (Atom)
没有评论:
发表评论