Я пытаюсь хранить и извлекать изображения, используя libjpeg-turbo, я пробовал следующий код, но это приводит к потере, когда я сравниваю его с исходным использованным изображением.
CompressSave () принимает cv :: Mat, который содержит данные изображения, которые необходимо сохранить в виде файла jpg.
Я передаю данные изображения, которые должны быть сохранены, в CompressSave (), который сжимает данные и сохраняет их в формате JPG. DeCompressRead () используется для чтения данных и распаковки из сохраненного изображения.
Я пропустил какие-либо параметры?
Я использовал Обработка файлов, так как сохранение tjSave вызывает это сбой.
void CompressSave(cv::Mat img, std::string filename)
{
const int JPEG_QUALITY = 100;
const int COLOR_COMPONENTS = 3;
int _width = img.rows;
int _height = img.cols;
long unsigned int _jpegSize = 0;
unsigned char* _compressedImage = NULL; //!< Memory is allocated by tjCompress2 if _jpegSize == 0
unsigned char* buffer = img.data;
tjhandle _jpegCompressor = tjInitCompress();
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_ACCURATEDCT);
tjDestroy(_jpegCompressor);
FILE *file = fopen(filename.c_str(), "wb");
if (!file) {
std::cout << "Could not open JPEG file: " << strerror(errno);
return;
}
if (fwrite(_compressedImage, _jpegSize, 1, file) < 1) {
cerr << "Could not write JPEG file: " << strerror(errno);
return;
}
fclose(file);
//to free the memory allocated by TurboJPEG (either by tjAlloc(),
//or by the Compress/Decompress) after you are done working on it:
tjFree(_compressedImage);
}
unsigned char* DeCompressRead(std::string fileName)
{
const int JPEG_QUALITY = 100;
const int COLOR_COMPONENTS = 3;
int _width;
int _height;
long unsigned int _jpegSize = 0;
unsigned char* _compressedImage; //!< Memory is allocated by tjCompress2 if _jpegSize == 0
long size;
int inSubsamp, inColorspace;
unsigned long jpegSize;
unsigned char* jpegBuf = nullptr;
unsigned char *imgBuf = nullptr;
int align(0);
//int pixelFormat;
int flags(0);
FILE *jpegFile = nullptr;
jpegFile = fopen(fileName.c_str(), "rb");
fseek(jpegFile, 0, SEEK_END);
size = ftell(jpegFile);
fseek(jpegFile, 0, SEEK_SET);
jpegSize = (unsigned long)size;
jpegBuf = (unsigned char *)tjAlloc(jpegSize);
fread(jpegBuf, jpegSize, 1, jpegFile);
fclose(jpegFile); jpegFile = NULL;tjhandle _jpegDecompressor = tjInitDecompress();
int jpegSubsamp;
tjDecompressHeader2(_jpegDecompressor, jpegBuf, jpegSize, &_width, &_height, &jpegSubsamp);
int pixelFormat = TJPF_RGB;
imgBuf = (unsigned char *)tjAlloc(_width * _height * tjPixelSize[pixelFormat]);
tjDecompress2(_jpegDecompressor, jpegBuf, jpegSize, imgBuf, _width, 0/*pitch*/, _height, TJPF_RGB, TJFLAG_ACCURATEDCT);
tjDestroy(_jpegDecompressor);
return imgBuf;
}
Задача ещё не решена.
Других решений пока нет …