libjpeg库读取jpg图片:
#include <setjmp.h>
#include "jpeglib.h"
int read_JPEG_file1(const char* filename)
{
struct jpeg_decompress_struct cinfo;
struct my_error_mgr jerr;
FILE* infile;
//JSAMPARRAY buffer;
int row_stride;
if ((infile = fopen(filename, "rb")) == NULL) {
fprintf(stderr, "can't open %s\n", filename);
return 0;
}
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
if (setjmp(jerr.setjmp_buffer)) {
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, infile);
// 这个函数获取了读取图片的信息,包括图片的高和宽
(void)jpeg_read_header(&cinfo, TRUE);
(void)jpeg_start_decompress(&cinfo);
row_stride = cinfo.output_width * cinfo.output_components;
//buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1);
unsigned char* buffer = new unsigned char[cinfo.image_width *3]();
const char* filename1 = "image2.txt";
FILE* fd1 = fopen(filename1, "wb");
while (cinfo.output_scanline < cinfo.output_height) // output_scanline是已经读取过的行数
{
(void)jpeg_read_scanlines(&cinfo, &buffer, 1); //保存顺序是RGB
if (fd1)
{
fwrite(buffer, row_stride, 1, fd1);
}
}
if (fd1)
{
fclose(fd1);
}
(void)jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(infile);
return 0;
}
在利用opencv将rgb数据显示出来:
unsigned char* pData = nullptr;
long len = 0;
const char* filename1 = "image2.txt";
FILE* fd1 = fopen(filename1, "rb");
if (fd1)
{
fseek(fd1, 0L, SEEK_END);
len = ftell(fd1);//通过fseek和ftell返回文件最后一个指针位置
pData = new unsigned char[len]();
fseek(fd1, 0, SEEK_SET);
size_t nrd = fread(pData, 1, len, fd1);
fclose(fd1);
}
cv::Mat img(916, 900, CV_8UC3, pData);
imshow("Dlib特征点", img);
cv::waitKey(0);