WEB开发网
开发学院手机开发Android 开发 Android jpeglib库在内存中实现解码 阅读

Android jpeglib库在内存中实现解码

 2010-09-10 00:39:00 来源:WEB开发网   
核心提示:熟悉 libjpeg的朋友都知道libjpeg是一个开源的库,Linux和Android都是用libjpeg来支持jpeg文件的,Android jpeglib库在内存中实现解码,可见其功能多么强大,但是默认情况下libjpeg只能处理jpeg文件的解码,进而实现对多种输入的支持的,但是libjpeg没有更这样做,或者

熟悉 libjpeg的朋友都知道libjpeg是一个开源的库。Linux和Android都是用libjpeg来支持jpeg文件的,可见其功能多么强大。但是默认情况下libjpeg只能处理jpeg文件的解码,或者把图像编码到jpeg文件。在嵌入式设备中没有文件系统也是很正常的事情,难道我们就不能利用libjpeg的强大功能了吗?当然不是!本文将会介绍怎样扩展libjpeg让其能够解码内存中的jpeg数据。

在介绍主题之前,请允许我讨论一下公共代码库的数据输入的一些问题。因为一个公共代码库是开放给大家用的,这个世界的输入方式也是多种多样的,比如可以通过文件输入,shell用户手工输入,内存缓存输入,网络socket输入等等。所以实现库的时候,千万不要假定用户只有一种输入方式。

通用的做法是实现一个输入的中间层。如果库是以支持面向对象语言实现的话,可以实现一套流机制,实现各式各样的流(文件流,缓存流,socket流等)。公共代码库的输入为流对象。这样库就可以实现各式各样的输入了。一个例子请参考Android图形引擎Skia的实现。

假如库是用非面向对象的语言实现的话,那么怎样来实现多种输入方式呢?可以通过定义输入对象的数据结构,该数据结构中让用户注册读写数据的函数和数据。因为只有调用者最清楚他的数据来源,数据读取方式。在公共代码库中,只需要调用用户注册的回调函数对数据进行读写就可以了。这样的话,也可以实现公共代码库对多种输入方式的支持。

回到本文的主题,libjpeg对多种输入的支持就不好,它假设了用户只会用文件作为输入,没有考虑其他的输入方式。经过研究他的源代码发现其内部也是非常容易扩展,进而实现对多种输入的支持的,但是libjpeg没有更这样做,不明白为什么。请看jpeglib.h中如下定义:

/* Data source object for decompression */

struct jpeg_source_mgr {

const JOCTET * next_input_byte; /* => next byte to read from buffer */

size_t bytes_in_buffer; /* # of bytes remaining in buffer */

JMETHOD(void, init_source, (j_decompress_ptr cinfo));

JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));

JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));

JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int

1 2 3 4 5  下一页

Tags:Android jpeglib 内存

编辑录入:coldstar [复制链接] [打 印]
赞助商链接