现在的位置: 首页 > 综合 > 正文

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

2013年10月07日 ⁄ 综合 ⁄ 共 2316字 ⁄ 字号 评论关闭

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);
}

 

 

楼的朋友,这些函数25平台上是有的,在文件gdi_layer.c中可以看到该函数实现过程,如果你看不到gdi_layer.c,可能你所在的单位为保护代码外流,对MTK代码做了封装,但应该不影响使用。 2楼的朋友,函数gdi_image_abm_set_source_layer用法与gdi_push_and_set_alpha_blending_source_layer一样,传入要设置层就可以了,不过gdi_image_abm_set_source_layer在设置新层为alpha_blending_source_layer时会返回老的alpha_blending_source_layer层的HAND,你要保存好,使用完后一定要记着把老的层还原。 3楼的朋友的回复又让人受益良多,熟悉各种图像格式的优缺点和MTK与之对应的API和处理机制,对我们的工作是有莫大好处的。

抱歉!评论已关闭.