在老的lib-jpeg上面添加 从内存加载jpg图片的接口

    由于老的lib-jpeg只支持从文件加载jpg图片 不支持从内存加载jpg图片  但是嵌入式测大部分情况下都是将图片下载至内存中 然后解析显示的 所以需要在此基础上添加从内存加载jpg的接口。这些代码只要你包含了对应的头文件 放在 你自己的代码中也是可以的。具体代码如下

METHODDEF(void)

init_mem_source (j_decompress_ptr cinfo)
{
  /* no work necessary here */
}


METHODDEF(boolean)
fill_mem_input_buffer (j_decompress_ptr cinfo)
{
  static const JOCTET mybuffer[4] = {
    (JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
  };


  /* The whole JPEG data is expected to reside in the supplied memory
   * buffer, so any request for more data beyond the given buffer size
   * is treated as an error.
   */
  WARNMS(cinfo, JWRN_JPEG_EOF);


  /* Insert a fake EOI marker */


  cinfo->src->next_input_byte = mybuffer;
  cinfo->src->bytes_in_buffer = 2;


  return TRUE;
}


METHODDEF(void)
skip_input_data (j_decompress_ptr cinfo, long num_bytes)
{
  struct jpeg_source_mgr * src = cinfo->src;


  /* Just a dumb implementation for now.  Could use fseek() except
   * it doesn't work on pipes.  Not clear that being smart is worth
   * any trouble anyway --- large skips are infrequent.
   */
  if (num_bytes > 0) {
    while (num_bytes > (long) src->bytes_in_buffer) {
      num_bytes -= (long) src->bytes_in_buffer;
      (void) (*src->fill_input_buffer) (cinfo);
      /* note we assume that fill_input_buffer will never return FALSE,
       * so suspension need not be handled.
       */
    }
    src->next_input_byte += (size_t) num_bytes;
    src->bytes_in_buffer -= (size_t) num_bytes;
  }
}


extern GLOBAL(boolean)
jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired);


METHODDEF(void)
term_source (j_decompress_ptr cinfo)
{
  /* no work necessary here */
}


GLOBAL(void)
jpeg_mem_src (j_decompress_ptr cinfo,
	      const unsigned char * inbuffer, unsigned long insize)
{
  struct jpeg_source_mgr * src;


  if (inbuffer == NULL || insize == 0)	/* Treat empty input as fatal error */
    ERREXIT(cinfo, JERR_INPUT_EMPTY);


  /* The source object is made permanent so that a series of JPEG images
   * can be read from the same buffer by calling jpeg_mem_src only before
   * the first one.
   */
  if (cinfo->src == NULL)
  {	/* first time for this JPEG object? */
    cinfo->src = (struct jpeg_source_mgr *)
      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
				  SIZEOF(struct jpeg_source_mgr));
  }


  src = cinfo->src;
  src->init_source = init_mem_source;
  src->fill_input_buffer = fill_mem_input_buffer;
  src->skip_input_data = skip_input_data;
  src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
  src->term_source = term_source;
  src->bytes_in_buffer = (size_t) insize;
  src->next_input_byte = (const JOCTET *) inbuffer;
}
添加完成后使用jpeg_mem_src来代替原来的jpeg_stdio_src即可。 其后两个参数为 图片的数据 以及数据的大小。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值