資源簡介
基于GEC210 上實現電子相冊的圖片閱覽功能 , 用雙循環鏈表實現, 其他功能可以自行添加,包括遍歷文件夾目錄查找等等

代碼片段和文件信息
#include?“mytype.h“
//?將jpeg文件的壓縮圖像數據讀出,放到jpg_buffer中去等待解壓
unsigned?long?read_image_from_file(int?fd
???unsigned?char?*jpg_buffer
???unsigned?long?jpg_size)
{
unsigned?long?nread?=?0;
unsigned?long?total?=?0;
while(jpg_size?>?0)
{
nread?=?read(fd?jpg_buffer?jpg_size);
jpg_size?-=?nread;
jpg_buffer?+=?nread;
total?+=?nread;
}
close(fd);
return?total;
}
int?Stat(const?char?*filename?struct?stat?*file_info)
{
int?ret?=?stat(filename?file_info);
if(ret?==?-1)
{
fprintf(stderr?“[%d]:?stat?failed:?“
“%s\n“?__LINE__?strerror(errno));
exit(1);
}
return?ret;
}
int?Open(const?char?*filename?int?mode)
{
int?fd?=?open(filename?mode);
if(fd?==?-1)
{
fprintf(stderr?“[%d]:?open?failed:?“
“%s\n“?__LINE__?strerror(errno));
exit(1);
}
return?fd;
}
int?decode_jpg(char*?filename)
{
node_t?*picture?=?(node_t*)malloc(sizeof(node_t));
//?讀取圖片文件屬性信息
//?并根據其大小分配內存緩沖區jpg_buffer
struct?stat?file_info;
Stat(filename?&file_info);
int?fd?=?Open(filename?O_RDONLY);
unsigned?char?*jpg_buffer;
jpg_buffer?=?(unsigned?char?*)calloc(1?file_info.st_size);
read_image_from_file(fd?jpg_buffer?file_info.st_size);
/***********?以下代碼都是固定的套路?****************/
//?聲明解壓縮結構體,以及錯誤管理結構體
struct?jpeg_decompress_struct?cinfo;
struct?jpeg_error_mgr?jerr;
//?使用缺省的出錯處理來初始化解壓縮結構體
cinfo.err?=?jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
//?配置該cinfo,使其從jpg_buffer中讀取jpg_size個字節
//?這些數據必須是完整的JPEG數據
jpeg_mem_src(&cinfo?jpg_buffer?file_info.st_size);
//?讀取JPEG文件的頭,并判斷其格式是否合法
int?ret?=?jpeg_read_header(&cinfo?true);
if(ret?!=?1)
{
fprintf(stderr?“[%d]:?jpeg_read_header?failed:?“
“%s\n“?__LINE__?strerror(errno));
exit(1);
}
//?開始解碼
jpeg_start_decompress(&cinfo);
//?妥善保管圖片的尺寸信息
picture->image_info.width?=?cinfo.output_width;
picture->image_info.height?=?cinfo.output_height;
picture->image_info.pixel_size?=?cinfo.output_components;
//?計算一行的字節數
int?row_stride?=?picture->image_info.width?*
picture->image_info.pixel_size;
//?根據圖片的尺寸大小,分配一塊相應的內存rgb_buffer
//?用來存放從jpg_buffer解壓出來的圖像數據
unsigned?long?rgb_size;
rgb_size?=?picture->image_info.width?*
picture->image_info.height?*?
picture->image_info.pixel_size;
picture->rgb_buf?=?(unsigned?char?*)calloc(1?rgb_size);
//?循環地將圖片的每一行讀出并解碼到rgb_buffer中
int?line?=?0;
while(cinfo.output_scanline? {
unsigned?char?*buffer_array[1];
buffer_array[0]?=?picture->rgb_buf?+
(cinfo.output_scanline)?*?row_stride;
jpeg_read_scanlines(&cinfo?buffer_array?1);
}
//?解壓完了,將jpeg相關的資源釋放掉
? jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
free(jpg_buffer);
//?現在我們得到了兩個必要的東西:
//?圖片的尺寸信息:?picture->image_info
//?圖片的RGB數據:??picture->rgb_buf
/**************?以上代碼都是固定的套路?*********************/
add_link(picture);
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????15114??2018-05-10?14:03??電子相冊\a.out
?????文件???????3365??2018-05-10?12:31??電子相冊\decode.c
?????文件???????1158??2018-05-10?14:06??電子相冊\display.c
?????文件???????1722??2018-05-09?22:48??電子相冊\find.c
?????文件????????461??2018-05-10?11:37??電子相冊\li
?????文件???????1061??2018-05-10?13:50??電子相冊\main.c
?????文件???????1820??2018-05-10?14:01??電子相冊\mapped.c
?????文件???????1016??2018-05-10?13:55??電子相冊\mytype.h
?????目錄??????????0??2018-05-12?14:10??電子相冊
-----------?---------??----------?-----??----
????????????????25717????????????????????9
- 上一篇:Modbus Rtu Slave從機demo實現串口通信
- 下一篇:電腦鼠競賽
評論
共有 條評論