首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查看.bin文件(YCbCr 4:2:2格式)

查看.bin文件(YCbCr 4:2:2格式)
EN

Stack Overflow用户
提问于 2016-02-09 17:39:56
回答 3查看 4.3K关注 0票数 1

我得到了一个.bin文件。我知道这个文件中的元素对应于YCbCr值(4:2:2)。此外,数据类型为8位。如何查看此内容?

我发现了一个很好的网站:http://rawpixels.net/,它做了除了YUV格式之外应该做的事情。我想要YCbCr格式。

Priliminary google search会将其转换为RGB,这并不是我们所希望的。我在dropbox上附上了一个示例.bin文件。图像大小为720X576。

EN

回答 3

Stack Overflow用户

发布于 2016-02-09 18:27:52

来自Wikipedia

Y‘YCbCr经常与YUV颜色空间混淆,通常术语YCbCr和YUV可以互换使用,导致一些混淆;当提到视频或数字形式的信号时,术语"YUV“通常表示”Y’YCbCr“。

如果您使用的是基于linux的系统,并且可以访问ffmpeg,则以下命令会正确显示数据

代码语言:javascript
运行
复制
ffplay -f rawvideo -video_size 720x576 -pix_fmt yuyv422 38.bin

另一个显示RGB/YCbCr图像的好工具是vooya,它在linux上是免费的,但在windows上是免费的。

我自己的工具yuv-viewer也能正常工作。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-02-09 19:27:25

您可以对4:2:2下采样的色度进行上采样,如下所示:

代码语言:javascript
运行
复制
////////////////////////////////////////////////////////////////////////////////
// unpack.c
// Mark Setchell
//
// Convert YCbCr 4:2:2 format file to full YCbCr without chroma subsampling
//
// Compile with:
//    gcc -o unpack unpack.c
// Run with:
//    ./unpack < input.bin > output.bin
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <sys/uio.h>
#include <unistd.h>
#include <sys/types.h>

int main(){
    unsigned char ibuf[4];  // Input data buffer format: Y Cb Y Cr
    unsigned char obuf[6];  // Output data buffer format: Y Cb Cr Y Cb Cr

    // Read 4 bytes at a time, and upsample chroma
    while(fread(ibuf,4,1,stdin)==1){
       obuf[0]=ibuf[0];
       obuf[1]=ibuf[1];
       obuf[2]=ibuf[3];
       obuf[3]=ibuf[2];
       obuf[4]=ibuf[1];
       obuf[5]=ibuf[3];
       fwrite(obuf,6,1,stdout);
    }
    return 0;
}

然后,您将对up-sample运行此命令:

代码语言:javascript
运行
复制
./unpack < input.bin > output.bin

然后使用ImageMagick convert获得如下格式的PNG (或JPEG,或TIF):

代码语言:javascript
运行
复制
convert -size 720x576 -depth 8 yuv:result.bin  image.png

从理论上讲,ImageMagick应该能够使用这样的命令行自己进行上采样(而不需要C程序),但我似乎不能让它工作:

代码语言:javascript
运行
复制
convert -interlace none -sampling-factor 4:2:2 -size 720x576 -depth 8 yuv:input.bin image.jpg

如果有人知道为什么-请评论!

票数 1
EN

Stack Overflow用户

发布于 2016-02-10 02:49:05

这是我的另一个答案的一个稍微不同的版本,因为它对色度进行了上采样,并将YUV转换为RGB,然后创建了一个NetPBM PNM格式文件。这意味着您只需从NetPBM安装pnmtopng实用程序即可获得PNM映像- NetPBMImageMagick更轻便,安装也更简单。

代码语言:javascript
运行
复制
////////////////////////////////////////////////////////////////////////////////
// yuv2pnm.c
// Mark Setchell
//
// Convert YUV 4:2:2 format file to RGB PNM format without chroma subsampling
//
// Compile with:
//    gcc -o yuv2pnm yuv2pnm.c
//
// Run with:
//    ./yuv2pnm < input.bin > output.pnm
//
// and then use ImageMagick to go to PNG format, or JPEG or TIF, with
//
//    convert output.pnm image.png
//
// or, all in one line (still with ImageMagick) to JPEG:
//
//    ./yuv2pnm < input.bin | convert pnm:- image.jpg
//
// or, use the (simpler-to-install) NetPBM's "pnmtopng" to convert to a PNG file
//
//    ./yuv2pnm < input.bin | pnmtopng - > image.png
////////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#define MIN(a,b)    (a<b) ? a : b

void YUV2RGB(unsigned char Y,unsigned char U, unsigned char V,unsigned char *RGB)
{
    int R,G,B;
    R = Y + (1.370705 * (V-128));
    G = Y - (0.698001 * (V-128)) - (0.337633 * (U-128));
    B = Y + (1.732446 * (U-128));
    RGB[0] = MIN(255,R);
    RGB[1] = MIN(255,G);
    RGB[2] = MIN(255,B);
}

int main(int argc,char* argv[]){

    unsigned char buf[4];   // Input data buffer format:  Y Cb Y Cr
    unsigned char RGB[6];   // Output data buffer format: R G B R G B
    int width=720;
    int height=576;

    // Write PNM header
    fprintf(stdout,"P6\n");
    fprintf(stdout,"%d %d\n",width,height);
    fprintf(stdout,"255\n");    

    // Read 4 bytes at a time, upsample chroma and convert to 2 RGB pixels
    while(fread(buf,4,1,stdin)==1){
       YUV2RGB(buf[0],buf[1],buf[3],&RGB[0]);
       YUV2RGB(buf[2],buf[1],buf[3],&RGB[3]);
       fwrite(RGB,6,1,stdout);
    }
    return 0;
}

here描述了NetPBM格式。注意:PNM是包含PPM的缩写。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35288494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档