MTK界面设计中消除PNG图片的杂色背景

PNG图片因为体积小,背景可以透明,并且由于采用矢量图像技术可以制作无锯齿的圆角类型的图形等优势。曾经在网页和一些领域得到广泛应用。近来可能是由于MTK的热门提供了更多的工作机会,导致不少以前从事网站创作的美术人员也转入到手机行业。这些同志们设计的UI充斥了大量的PNG图片。给MTK的MMI工程师提供了不小的挑战。

确切的说,我认为在MTK手机平台上,PNG并不具有显著优势。MTK会把PNG转化为一种BMPA的中间格式,该格式并不比同样效果的BMP小,有时还会大上许多。至于背景透明,其实在MTK平台,是可以把一幅BMP显示为背景透明的。这样PNG存在的唯一意义大约就在于显示一些更精致的需要流线型图像效果的UI里了。而PNG在使用过程中,在某些方面,比如叠加,比如在层中使用,往往会存在一些显示效果不尽如人意的地方。这些原因导致许多MMI工程师不喜欢PNG,除非在非常必要的情况下,否则会直接到PNG用ASD转为BMP使用。虽然许多时候我也不建议使用PNG,但有些必要场合,使用PNG毕竟也能为手机显示增色不少。

一次帮客户设计UI时,遇到在层中显示PNG图片显示乱屏,图的背景有杂色,图标边缘通透等问题,严重影响了显示效果。本可转为BMP重新设计,后来抱着学习的态度搜了一下52RD,竟然有人提供了一个解决了函数gdi_image_abm_set_source_layer,后来研究了一下,果然解决了这个问题。

附上样例程序:(由于该层在移动过程中只是位置改变,然后刷在屏上,所以没有把把创建层的代码与使用代码分开,图片IMG_IDLE_TIME_BG为PNG,背景上显示的字符也为PNG图片,能够消除PNG层乱屏杂色问题的函数是gdi_push_and_set_alpha_blending_source_layer,当然gdi_image_abm_set_source_layer也能达到)
void DrawDateTimeLayer(U16 x, U16 y)

       #ifdef WIN32
 buf_ptr = (PU8)malloc(180*61*2);
 #else
 buf_ptr = (PU8)med_alloc_ext_mem(180*61*2);
 #endif

 if (buf_ptr == NULL)
 {
  MMI_ASSERT(0);
 }
 

 gdi_layer_create_using_outside_memory(
                                            0,
                                            0,
                                            180,
                                            61,
                                            &mylayer,
                                            (PU8) buf_ptr,
                                            (S32) 180*61*2);

 gdi_layer_push_and_set_active(mylayer);
  gdi_layer_set_position(x, y); //设置激活层的位置
 gdi_push_and_set_alpha_blending_source_layer(mylayer);  //把mylayer层作为blending层
 gdi_layer_clear_background(GDI_COLOR_WHITE);
 gdi_layer_set_source_key(TRUE, GDI_COLOR_WHITE);
gdi_image_draw_id(x, y, IMG_IDLE_TIME_BG); //绘制时间背景
 gdi_pop_and_restore_alpha_blending_source_layer();    //恢复blending层
 gdi_layer_pop_and_restore_active();
 gdi_layer_set_blt_layer(dm_get_wallpaper_layer(), GDI_LAYER_MAIN_BASE_LAYER_HANDLE, mylayer, NULL);
 gdi_layer_blt_previous(0, 0, UI_device_width-1, UI_device_height - 1);
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值