#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);
}
turbojpeg tjDecompress 的解码
最新推荐文章于 2024-07-19 14:14:22 发布