资源简介
基于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 < cinfo.output_height)
{
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实现串口通信
- 下一篇:电脑鼠竞赛
相关资源
- linux按键测试,获取按键状态
- Pycharm汉化解决不能设置的问题.zip
- STM32模拟SPi.rar
- ARM6818电子钢琴
- 论文研究-基于ARM的嵌入式网络视频监
- 嵌入式系统/ARM技术中的基于ARM的新型
- RN7213是ARM Cortex-M0内核的电表SOC芯片带
- RN7213是ARM Cortex-M0内核的电表SOC芯片带
- 基于ARM处理器的CAN-Ethernet通信模块实
- Keil_ARM_MDK 5.15 支持5.1以上MDK专业版的
- 嵌入式LINUX基础教程中文第2版 --百度
- IAR Generic Keygen
- ARM开发板LPC2132电路PCB图与SCH原理图
- 基于Ucos的多任务实现
- arm开发流程、最小系统、启动文件详
-
VNC viewer for em
bedded WIN CE system (在嵌 - GPS数据接收与提取流程图
- s3c2440下LED灯驱动的源代码
- 现代信号处理练习-古典功率谱、现代
- ADS1259源程序
- pycharm各种主题包括仿sublime的monokai主
- SM_ARMV4I_V2.1.zip
- ARM Mini2440 电路图.
- IAR for ARM 5.3破解文件
- exfat_new-ARM平台驱动源码包
- 支持ucos的数据库及移植
-
Jli
nk unlock for F1,解锁F1系列的ARM芯 - EWARM-CD-7804-12495
- ARM裸机实验之用按键控制LED灯
- IAR个版本的安装和和谐文件
评论
共有 条评论