簡體   English   中英

使用jpeg_read_raw_data函數從jpeg文件讀取原始數據

[英]Read raw data from jpeg file using jpeg_read_raw_data function

對不起,我的英語不好...

因此,我嘗試解壓縮在Microsoft Paint中創建的128x128 jpeg圖像。 圖像全黑。

我以xawtv源為例,創建了自己的jpeg到yuv解壓縮器( http://xawtv.sourcearchive.com/documentation/3.95.dfsg.1/conv-mjpeg_8c-source.html )。 解壓縮器僅適用於4:2:0級的yuv二次采樣。

當我等於112時,應用程序在jpeg_read_raw_data函數中引發訪問沖突。有人可以幫助解決此問題嗎?

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

#include "jpeglib.h"

typedef std::vector<unsigned char> buffer;

class decompressor
{
public:

    decompressor(buffer& ibuf)
          : ibuf_(ibuf), yuvbuf_(3)
    {
        info_.err = jpeg_std_error(&e_);

        jpeg_create_decompress(&info_);

        jpeg_mem_src(&info_, &ibuf_[0], ibuf_.size());
    }

    virtual ~decompressor()
    {
        jpeg_destroy_decompress(&info_);
    }

    virtual void decompress(buffer& obuf)
    {
        jpeg_read_header(&info_, 1);

        info_.raw_data_out = 1;

        jpeg_start_decompress(&info_);

        obuf.resize(
            info_.output_width *
            info_.output_height *
            info_.output_components);

        for (std::size_t i = 0; i < yuvbuf_.size(); ++i)
        {
            yuvbuf_[i].resize(info_.output_width);
            yuvptr_[i] = &yuvbuf_[i][0];
        }

        unsigned char* row = &obuf[0];

        for (std::size_t i = 0; i < info_.output_height; ++i, row += info_.output_width)
        {
            yuvptr_[0][i] = row;
        }

        row = &obuf[0] + info_.output_width * info_.output_height;

        for (std::size_t i = 0; i < info_.output_height; i += 2, row += info_.output_width / 2)
        {
            yuvptr_[1][i / 2] = row;
        }

        row = &obuf[0] + info_.output_width * info_.output_height * 5 / 4;

        for (std::size_t i = 0; i < info_.output_height; i += 2, row += info_.output_width / 2)
        {
            yuvptr_[2][i / 2] = row;
        }

        for (std::size_t i = 0; i < info_.output_height; i += 16)
        {
            jpeg_read_raw_data(&info_, yuvptr_, 16);

            yuvptr_[0] += 16;
            yuvptr_[1] += 8;
            yuvptr_[2] += 8;
        }

        jpeg_finish_decompress(&info_);
    }

protected:

    jpeg_decompress_struct info_;

    jpeg_error_mgr e_;

    buffer& ibuf_;

    std::vector<
        std::vector<unsigned char*>
    > yuvbuf_;

    unsigned char** yuvptr_[3];
};

int main()
{
    std::string filename;

    filename = "i.jpg";

    std::fstream ifs(filename.c_str(), std::ios::in | std::ios::binary);
    if (!ifs)
    {
        std::cout << "can not open file " << filename;
        return 1;
    }

    filename = "o.dat";

    std::fstream ofs(filename.c_str(), std::ios::out | std::ios::binary);
    if (!ofs)
    {
        std::cout << "can not open file " << filename;
        return 1;
    }

    std::size_t size;

    ifs.seekg(0, std::ios::end);
    size = ifs.tellg();
    ifs.seekg(0);

    buffer ibuf(size);
    buffer obuf;

    ifs.read((char*)&ibuf[0], ibuf.size());

    decompressor d(ibuf);

    d.decompress(obuf);

    ofs.write((char*)&obuf[0], obuf.size());

    return 1;
}

我發現了一個錯誤,但是output_width和output_height都等於128。所以,問題不在這里...

for (std::size_t i = 0; i < yuvbuf_.size(); ++i)
{
    yuvbuf_[i].resize(info_.output_width);
    yuvptr_[i] = &yuvbuf_[i][0];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM