Jiang_Fantasy 2019-07-01 14:47 采纳率: 0%
浏览 1604

请问如何用c语言从jpg图片读取出yuv420sp nv21格式的信息(jpg转nv21)

请问如何用c语言从jpg图片读取出yuv420sp nv21格式的信息(jpg转nv21),尽量不依赖别的库,或者使用libjpeg库

  • 写回答

1条回答 默认 最新

  • 森啥of 2019-07-01 14:55
    关注

    有这样一个二进制文件,大小在100M左右,里面存放了多张JPG图片,文件格式如下:

    无关数据区

    JPG图片数据区

    无关数据区

    JPG图片数据区

    无关数据区

    JPG图片数据区

    ......

    已知JPG图片起始标志为:“FF D8 FF E0 00 10 4A”,结束标志为:“FF D9”。

    现想把这些JPG图片数据从该文件中读出来,生成一个个单独的图片文件,该如何做呢?

    帮你写了个程序, 测试了只含有一个图片信息的文件

    int len=0;

    int filesn=0;

    void ReadJpg(CFile *sfp,const char *dstfile,unsigned char a,unsigned char b)

    {

    CFile nf;

    nf.Open(dstfile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);

    unsigned t=0,t1=0;

    nf.Write(&a,sizeof(char));

    nf.Write(&b,sizeof(char));

    while(1)

    {

    sfp->Read(&t,sizeof(char));

    len++;

    nf.Write(&t,sizeof(char));

    if(t==0xFF)

    {

    sfp->Read(&t1,sizeof(char));

    len++;

    if(t1==0xD9)

    break;

    else

    nf.Write(&t1,sizeof(char));

    }

    }

    nf.Close();

    }

    调用:

    void test()

    {

    CFile fp;

    fp.Open("86b05621.jpg",CFile::modeRead|CFile::typeBinary);//文件名改一下

    unsigned char a=0,b=0;

    len=0;

    while(1)

    {

    fp.Read(&a,sizeof(char));

    len++;

    if(len>=fp.GetLength())

    break;

    if(a==0xFF)

    {

    fp.Read(&b,sizeof(char));

    len++;

    if(b==0xD8)

    {

    filesn++;

    char filename[256];

    sprintf(filename,"Jpg %d.jpg",filesn);

    ReadJpg(&fp,filename,a,b);

    }

    }

    }

    fp.Close();

    }

    思路是,先得到FF的值,然后再判断下一位是否是0xD8, 但这里要说明一下,如果你的其它数据信息里也含有FF D8值的话就会出错了, 所以为保险起见,应该再多比较几位, JPG的头是固定的,再往下就是EF E0 00 1E, 建议楼主再往下比较四位比较保险(在程序中稍作修改即可)

    你是不是在 分析某个 游戏的或程序的资源文件呀,如果是的话,这个资源文件应该配有一个 索引文件!或在其文件自身。索引可以列表索引,链表形示……

    如果是你自已生成的文件包,最好加上索引,因为这样可以提高效率!

    评论

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用