使用libjpeg进行JPEG图像解码
如題:如何對test.jpg進行解碼?
注:這里使用libjpeg庫進行圖像解碼。也可以不使用libjpeg庫,但是比較繁瑣。
直接上代碼:
#include "jpeglib.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *input_file;
input_file=fopen("test.jpg","rb");
?
struct jpeg_decompress_struct cinfo;//JPEG圖像在解碼過程中,使用jpeg_decompress_struct類型的結構體來表示,圖像的所有信息都存儲在結構體中
? ? struct jpeg_error_mgr jerr;//定義一個標準的錯誤結構體,一旦程序出現錯誤就會調用exit()函數退出進程
? ?
cinfo.err = jpeg_std_error(&jerr);//綁定錯誤處理結構對象
? ? jpeg_create_decompress(&cinfo);//初始化cinfo結構
? ? jpeg_stdio_src(&cinfo,input_file);//指定解壓縮數據源
? ? jpeg_read_header(&cinfo,TRUE);//獲取文件信息
? ? jpeg_start_decompress(&cinfo);//開始解壓縮
? ? unsigned long width = cinfo.output_width;//圖像寬度
? ? unsigned long height = cinfo.output_height;//圖像高度
? ? unsigned short depth = cinfo.output_components;//圖像深度
? ?? unsigned char *src_buff;//用于存取解碼之后的位圖數據(RGB格式)
src_buff = (unsigned char *)malloc(width * height * depth);//分配位圖數據空間
? ? memset(src_buff, 0, sizeof(unsigned char) * width * height * depth);//清0
? ?? JSAMPARRAY buffer;//用于存取一行數據
? ? buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, width*depth, 1);//分配一行數據空間
unsigned char *point =?src_buff;
? ? while(cinfo.output_scanline < height)//逐行讀取位圖數據
? ? {
? ? ? ? jpeg_read_scanlines(&cinfo, buffer, 1); ? ?//讀取一行jpg圖像數據到buffer
? ? ? ? memcpy(point, *buffer, width*depth); ? ?//將buffer中的數據逐行給src_buff
? ? ? ? point += width * depth; ? ? ? ? ? ?//指針偏移一行
? ? }
? ? jpeg_finish_decompress(&cinfo);//解壓縮完畢
? ? jpeg_destroy_decompress(&cinfo);// 釋放資源
? ? free(src_buff);//釋放資源
? ? fclose(input_file);
}
程序中src_buff就是解碼之后的位圖數據
總結
以上是生活随笔為你收集整理的使用libjpeg进行JPEG图像解码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5(mp4)无法播放,HTML5
- 下一篇: 张泉灵:时代抛弃你时,连一声再见都不会说