ftk阅读笔记二(图片解码的实现)

本文介绍了一种图片解码输出的方法,通过创建FtkBitmapFactory对象并加载不同类型的图片(如BMP、JPEG、PNG等),利用特定的解码器提取每像素的RGB值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于图片的解码输出。

 图片的解码输出的主要流程处理在于将图片的中每一个像素的argb值提取出来。不同的图片的解码方式是不一样。这里我们统一了一个图片解码函数。
 FtkBitmap* ftk_bitmap_factory_load(FtkBitmapFactory* thiz, const char* filename);
 函数返回FtkBitmap 结构体,保存了每珍上像素中的rgb值。
 
 

FtkBitmapFactory* ftk_bitmap_factory_create(void);
FtkBitmap* ftk_bitmap_factory_load(FtkBitmapFactory* thiz, const char* filename);
Ret        ftk_bitmap_factory_add_decoder(FtkBitmapFactory* thiz, FtkImageDecoder* decoder);
void       ftk_bitmap_factory_destroy(FtkBitmapFactory* thiz);


FtkBitmapFactory* ftk_bitmap_factory_create(void) 接口函数,创建FtkBitmapFactory 对象,用于外部调用。
FtkBitmap* ftk_bitmap_factory_load(FtkBitmapFactory* thiz, const char* filename) 刚刚提到的了图片解码库函数。
Ret        ftk_bitmap_factory_add_decoder(FtkBitmapFactory* thiz, FtkImageDecoder* decoder) 增加能支持解码处理,
void       ftk_bitmap_factory_destroy(FtkBitmapFactory* thiz) 销毁FtkBitmapFactory 对象。


重点来看看ftk_bitmap_factory_create的处理过程。
FtkBitmapFactory* ftk_bitmap_factory_create(void)
{
 FtkBitmapFactory* thiz = (FtkBitmapFactory*)FTK_ZALLOC(sizeof(FtkBitmapFactory));

 if(thiz != NULL)
 {
#ifdef HAS_BMP
  ftk_bitmap_factory_add_decoder(thiz, ftk_image_bmp_decoder_create()); 
#endif

#ifdef HAS_JPEG
  ftk_bitmap_factory_add_decoder(thiz, ftk_image_jpeg_decoder_create()); 
#endif

#ifdef HAS_PNG
  ftk_bitmap_factory_add_decoder(thiz, ftk_image_png_decoder_create());
#endif

#ifdef WIN32
  ftk_bitmap_factory_add_decoder(thiz, ftk_image_win32_decoder_create());
#endif
 }

 return thiz;
}

实现对新的图片的解码支持。
ftk_bitmap_factory_add_decoder(thiz, ftk_image_bmp_decoder_create());

 

用一个指针数组保存解码图片解码实现对象, FtkImageDecoder* decoders[FTK_MAX_IMAGE_DECODERS]

Ret ftk_bitmap_factory_add_decoder(FtkBitmapFactory* thiz, FtkImageDecoder* decoder)
{
 return_val_if_fail(thiz != NULL && decoder != NULL, RET_FAIL);
 return_val_if_fail(thiz->nr < FTK_MAX_IMAGE_DECODERS, RET_FAIL);

 thiz->decoders[thiz->nr++] = decoder;

 return RET_OK;
}

解码对象
FtkImageDecoder* decoder

struct _FtkImageDecoder
{
 FtkImageDecoderMatch   match;
 FtkImageDecoderDecode  decode;
 FtkImageDecoderDestroy destroy;

 char priv[1];
};

解码提供以下三个接口函数,
static inline Ret ftk_image_decoder_match(FtkImageDecoder* thiz, const char* filename)
{
 return_val_if_fail(thiz != NULL && thiz->match != NULL, RET_FAIL);

 return thiz->match(thiz, filename);
}

static inline FtkBitmap* ftk_image_decoder_decode(FtkImageDecoder* thiz, const char* filename)
{
 return_val_if_fail(thiz != NULL && thiz->decode != NULL, NULL);

 return thiz->decode(thiz, filename);
}

static inline void ftk_image_decoder_destroy(FtkImageDecoder* thiz)
{
 if(thiz != NULL && thiz->destroy != NULL)
 {
  thiz->destroy(thiz);
 }

 return;
}

不同的图片解码对象在创建时实现各自对应的 FtkImageDecoderMatch   match; FtkImageDecoderDecode  decode; FtkImageDecoderDestroy destroy;

例如png解码库的创建
FtkImageDecoder* ftk_image_png_decoder_create(void)
{
 FtkImageDecoder* thiz = (FtkImageDecoder*)FTK_ZALLOC(sizeof(FtkImageDecoder));

 if(thiz != NULL)
 {
  thiz->match   = ftk_image_png_decoder_match;
  thiz->decode  = ftk_image_png_decoder_decode;
  thiz->destroy = ftk_image_png_decoder_destroy;
 }

 return thiz;
}

 

 

 

 


struct _FtkBitmapFactory
{
 int nr;  
 FtkImageDecoder* decoders[FTK_MAX_IMAGE_DECODERS];
};

 

 

struct _FtkBitmap
{
 int w;
 int h;
 int ref;
 int length;
 FtkColor bits[1];
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值