turbojpeg tjDecompress 的解码

#include "../../../Core/Include/CompilerDefines.h"
#include "../../../Core/Include/Utilities/Log.h"
#include "../../../Core/Include/Utilities/Globals.h"

#include <turbojpeg.h>
#pragma comment(lib, "turbojpeg.lib")

#include <memory>
#include <fstream>
#include <iostream>
#include <vector>
#include <tuple>

std::tuple<bool, std::vector<uint8>, uint0, uint32, uint32> ReadJpegAsRGB(uint8* pJpegData, uint0 JpegDataSize)
{
    int Width, Height, jpegsubsamp;

    tjhandle jpeg = tjInitDecompress();
    if (jpeg == nullptr)
    {
        Error("ReadJpegAsRGB() tjInitDecompress() failed: %s", tjGetErrorStr());
        return std::make_tuple(false, std::vector<uint8>(0), 0, 0, 0);
    }

    if (tjDecompressHeader2(jpeg, pJpegData, JpegDataSize, &Width, &Height, &jpegsubsamp) != 0)
    {
        Error("ReadJpegAsRGB() tjDecompressHeader2() failed: %s", tjGetErrorStr());
        return std::make_tuple(false, std::vector<uint8>(0), 0, 0, 0);
    }


    uint0 pitch = tjPixelSize[TJPF_RGB] * Width;
    uint0 Size = pitch * Height;
    std::vector<uint8> Output(Size);

    if (tjDecompress2(jpeg, pJpegData, JpegDataSize, &Output.front(), Width, pitch, Height, TJPF_RGB, 0) != 0)
    {
        Error("ReadJpegAsRGB() tjDecompress2() failed: %s", tjGetErrorStr());
        return std::make_tuple(false, std::vector<uint8>(0), 0, 0, 0);
    }

    return std::make_tuple(true, std::move(Output), Size, Width, Height);
}

std::tuple<bool, std::vector<uint8>, uint0, uint32, uint32> ReadJpegAsRGB(std::string filename)
{
    std::ifstream ifs(filename, std::ios_base::binary | std::ios_base::in);

    if (!ifs.good())
        return std::make_tuple(false, std::vector<uint8>(0), 0, 0, 0);

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

    std::vector<char> buffer(size);
    ifs.read(&buffer.front(), size);

    return ReadJpegAsRGB((uint8*)&buffer.front(), size);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值