- 浏览: 191392 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenpeilei2003:
acmersch 写道楼主对url中汉字或者特殊字符怎么解析? ...
lua解析url参数 -
acmersch:
楼主对url中汉字或者特殊字符怎么解析?
lua解析url参数 -
charlotte:
Begin at the beginning and go o ...
Intent的几种跳转方式 -
chenpeilei2003:
还没有解决。
为什么webview无法播放视频 -
jsgaohui:
请问博主这个问题解决了没,如果解决的话共享下方案,谢谢了!
为什么webview无法播放视频
MTK图片解码流程及png图片详解(转载)
2009-12-05 22:21
从事MTK平台的工作者很多,做高仿机的人也很多,MTK的界面变得越来越花哨,但是对于MTK平台实现进行研究的文章并不多,希望这篇文章和以后的几篇BLOG能为MTK的初学者带来一些帮助。
怎么使用MTK的函数显示图片相信大家都会,但是图片的解码过程就不是人人都去研究了,由于我们做JVM移植层的需要,最近对MTK的图形解码进行了一些研究。
MTK在绘制图形的时候使用的是gdi_image_codec_draw这个函数,在这个函数中,MTK会根据img_type这个参数从gdi_image_codecs这个全局数据结构数组中取得相应绘制回调函数。gdi_image_codecs全局变量在gdi_image.c文件中定义。
(1)BMP解析过程
当img_type为GDI_IMAGE_TYPE_BMP_FILE_OFFSET的时候,MTK会调用gdi_image_bmp_draw_handler作为BMP文件解析的处理函数。在这个函数中,MTK会根据程序员指定的显示大小对bmp文件进行放大或者缩小,由于这里我们只是简单研究一下,就不以图片的放大或者缩小为例子了,如果要研究图片的放大或者缩小,请各位自己研究。我们只研究不对bmp进行放大或者缩小的过程——gdi_image_bmp_draw_file函数。
gdi_image_bmp_draw_file这个函数在gdi_image_bmp.c文件中。这个函数一开始首先建立了一个比特流,在我看来就是把这个BMP文件打开,并把BMP的文件的数据放到gdi_bytestream_buffer这个全局数组中,为以后的解码做准备。接下来大家可能就要迷糊了,MTK使用的是gdi_image_bmp_draw_internal_from_file这样一个函数,这个函数是什么呢!说出来下一条,这个函数是个宏!确切的说这个曾经是函数调用的语句实际上被GDI_IMAGE_BMP_DRAW_INTERNAL这个宏所替代,而这个宏在gdi_image_bmp_codec.h中有一个同名函数,这样gdi_image_bmp_draw_internal_from_file就被指示成了GDI_IMAGE_BMP_DRAW_INTERNAL。我第一次就晕菜了,搞不懂为什么MTK要费这么大劲,绕这么多弯。
GDI_IMAGE_BMP_DRAW_INTERNAL就是解码过程,我们可以看到这里面有1,4,8,16,24,32位BMP的解码函数,如果我们解码的不是这些标准的BMP呢!对不起,MTK会重启!
(2)静态GIF图片的解码过程
当img_type为GDI_IMAGE_TYPE_GIF_FILE_OFFSET的时候,MTK会调用gdi_image_gif_draw_handler函数进行解码。在这个函数中同样分为可变大小和不可变大小,数据来源于文件还是来源与内存资源,这4种情况,我们还是只讨论数据来源于文件而且不进行缩放操作的情况——gdi_image_gif_draw_file。
gdi_image_gif_draw_file这个函数有两个分支。在整个函数的实现中,会有一个do{}while(0)的循环,在定义了硬件解码宏之后,在硬件解码结束以后使用一个break;语句跳出循环。软解码的代码在硬解码的代码后面,没有宏控制。当硬解码宏打开后,完全靠硬解码结束后的break来区分软硬解码。这样,如果硬解码出现问题,可能会造成严重的后果。我不清楚MTK为什么这样做,可能是他们认为硬解码的所有返回都已经处理过了,所以才使用这种方式的吧!
在6226,6228等高端的MTKCPU上,图像都是硬解码的。在这些CPU内部有一组专门的解码电路来对图形进行解码。在硬解码的时候,MTK最终会调用gif_decode_hw这个函数对CPU内部的寄存器进行相关的设置,最后调用GIF_START这个宏函数开始对GIF图形进行解码。
在6225以下的CPU中,所有的图像都是软解码的,这时MTK使用了ret = gdi_image_gif_draw_file_decoders[gdi_act_layer->cf] 这个语句。gdi_image_gif_draw_file_decoders是一个函数指针数组。这个数组定义在gdi_image_gif.c中,这个数组中的元素(例如gdi_image_gif_draw_internal_from_file_8等)其实都指向GDI_IMAGE_GIF_DRAW_INTERNAL这个宏,这个宏又在Gdi_image_gif_codec.h中对应一个同名函数。好像在哪里见过哈!对!BMP就是这样指来指去的。MTK的风格就是这样奇怪而统一。
GDI_IMAGE_GIF_DRAW_INTERNAL就是GIF的解码过程。 一开始,MTK向我们展示了一个catch机制,MTK把最后的2张GIF图片保存在一个gdi_gif_cache的数据结构中,首先检查程序员需要的是不是这两张图片。如果是就不用解析了,不是就要重新解析。解析的算法我们就不讨论了,喜欢研究的可以看看GDI_IMAGE_GIF_CODEC这个函数的实现,GIF由于有动画的设定,所以解析起来要比BMP复杂多了!
(3)JPEG图片解码过程
当img_type为GDI_IMAGE_TYPE_JPG_FILE_OFFSET的时候,MTK会调用gdi_image_jpeg_draw_handler函数进行解码。这个函数最终会调用gdi_image_hwjpeg_draw_internal。MTK把JPEG的软解码和硬解码的接口在这个函数层次统一了起来,gdi_image_hwjpeg_draw_internal会调用gdi_image_hwjpeg_start_decode,gdi_image_hwjpeg_start_decode再调用jpeg_decode_process函数。jpeg_decode_process函数再负责调用JPEG解码核心对JPEG图片进行解码。最后的解码函数为decode_jpeg_file这个函数。无论是软解码还是硬解码都要调用decode_jpeg_file这个函数。在JPEG图形解码这部分,MTK做的还是比较符合中国工程师习惯的。
还有一点,如果我们只想取得JPEG图像的数据,那么我们只要调用gdi_image_jpeg_draw_file_to_buffer或者gdi_image_jpeg_draw_to_buffer这两个函数好了。我们测试过,MTK对这两个函数的封装,封装的比较好。这样就给了我们一个通过JPEG图像传递某种信息的渠道。哦!搞的想干坏事一样,不说了,不说了!
(4)PNG图片解码过程
当img_type为GDI_IMAGE_TYPE_PNG_FILE_OFFSET的时候,MTK会对PNG进行解码,经过了上面的分析,我相信大家都能对MTK的图形解码的流程有了比较深刻的理解了,各位可以自己分析这个过程,我这边就不赘述了!
以上我自己是对MTK图形解码过程的大致分析,有不当之处还希望大家能够指正。
下一篇BLOG我准备谢谢如何在MTK平台下建立静态TASK,以及如何从MMITASK中接管控制权。这部分很简单同样是对应初学者的,希望老鸟不要拍砖!!!
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);
}
楼的朋友,这些函数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和处理机制,对我们的工作是有莫大好处的。
3楼 usstwonder 发表于 2009-6-25 10:39:00
PNG图片可以定义alpha通道,有了alpha通道,可以定义每个像素点的透明度,能做出很炫的图片效果来。当前MTK平台的PNG解码器用的是一个开源的PNG解码器:libpng,但是mtk对libpng进行了封装,在解码的时候需要传入blending层,mtk解码的时候,会跟据图片的alpha通道值,自动把解码出来的像素的和blending层的像素进去混合叠加,然后把混合叠加后的效果输出。gdi_push_and_set_alpha_blending_source_layer()是设置blending层,也就是png解码时用来当作背景的层。
发表评论
-
安卓截屏shell脚本
2014-08-10 00:26 1064写个脚本,不需要每次截屏都在电脑上打开eclipse了 1 ... -
plutil命令转换json与plist
2014-05-15 22:52 5953json to plist:plutil -convert x ... -
微博、微信审核经验分享
2013-10-24 09:44 10742新浪微博开放平台 先说一下, 使用新浪微博开放平台,第一大 ... -
用wireshark抓包并播放RTP流
2013-08-14 15:58 4824在做音视频开发过程中,需要经常抓包分析。 总结一种方法, ... -
多屏互动的相关资料
2013-08-06 14:24 0屏幕越整越多,咋办? 很多牛人都在想办法: 1.新近出 ... -
webRTC学习系列 在Linux下编译Test项目
2013-07-09 16:36 0Linux下webRTC编译笔记 网上有些webRTC编 ... -
Titanium
2011-11-16 20:02 819新玩意儿, Titanium -
小应用快速开发模式构思
2011-09-09 14:13 790经常能遇到一些小应用, 此类软件的生命周期一般就几个月甚至更短 ... -
http回调
2011-07-04 10:05 1060在做客户端应用时, 经常遇到联网, 需要获取远端服务的resp ... -
蓝牙基础概念
2010-10-11 12:32 1443Bluetooth 无线技术配置文件2008年01月27日 星 ... -
帧率修正
2010-07-29 15:19 852刚遇到这个问题, 当低速CPU上开发的游戏移植到高速CPU上, ... -
一个闭合多边形内,求n条线段相交的算法
2010-07-28 09:40 1476还没找到好方法,待续 -
lua解析url参数
2010-07-16 14:40 10137function Split(szFullString, ... -
游戏引擎演化史
2010-06-28 13:20 1187游戏引擎演化史 收藏 在阅读各种游戏介绍的时候我们常常会碰见 ... -
手机软件开发时的焦点管理策略
2010-06-18 15:22 1414随便写两句备忘 做手机应用时,会经常遇到UI布局,画一堆按钮 ... -
Lua里模拟typeof()获取对象类型
2010-06-18 14:37 15511自定义typeof()函数,获取"对象"类 ... -
用lua搭一个类似浏览器的控件框架
2010-06-13 14:18 2520公司要开发微博应用,除了最普通的微博功能之外,会嵌入很多运营那 ...
相关推荐
1. **文件格式转换**:MTK图片转工具可能支持将特定的MTK设备图像格式转换为常见的图片格式(如JPEG、PNG等),以便在其他设备上查看或编辑。 2. **批量处理**:考虑到设备制造商和开发者可能需要处理大量图像,此...
7. **调试和测试**:MTK图片生成工具可能包含一些辅助功能,如查看图片元数据、验证生成的图片数组、模拟加载过程等,这些都是调试和测试固件更新流程的重要环节。 8. **文件结构**:`MTKImage`这个文件很可能是由...
### MTK平台充电流程详解 #### 一、锂电池基础 在深入探讨MTK平台充电流程之前,我们需要了解一些关于锂电池的基础知识。 ##### 锂电池类型 目前市场上主要使用的锂电池有两种类型:一种是普通的4.2V锂电池,另一...
### MTK Dialing Screen流程详解 #### 拨号界面概览 MTK(MediaTek)作为一家全球领先的移动通信及多媒体终端的核心芯片供应商,在移动通信领域有着举足轻重的地位。本文旨在深入探讨MTK拨号界面的实现流程,通过...
MTK工程BIN文件图片资源提取器是一款专门针对采用MediaTek(MTK)芯片平台的工程BIN文件进行图像资源提取的工具。它可以帮助开发者或者设计师从这些二进制文件中提取出 BMP、GIF 和 JPG 格式的图片资源,以便于进行...
MTK平台的驱动设计通常遵循以下流程: 1. **初始化**:驱动在设备启动时加载,初始化传感器配置,如采样率、分辨率等。 2. **注册中断处理程序**:驱动会注册一个中断处理程序,当传感器有新数据时,硬件会产生中断...
MTK申请patch流程是MediaTek公司(MTK)为其客户提供的一种软件补丁管理流程,旨在帮助客户轻松查询和申请软件补丁。整个流程主要通过Patch Management System(PMS)系统实现。以下详细解释了MTK申请patch流程及其...
1. 导入图片:首先,开发者需要将所需的图片导入到工具中,这些图片可能包括UI界面的各种图标、背景图等。 2. 设置参数:根据需求,开发者可能需要调整图片的格式、大小、颜色深度等参数,以适应目标设备的硬件限制...
MTK LCD 移植详解 在 MTK feature phone 中,LCD 移植是一个重要的步骤。本文将详细介绍 MTK LCD 移植的过程,包括 Make 文件设置、驱动开发等方面的内容。 一、Make 文件设置 在 MTK feature phone 中,LCD 移植...
MTK GUI详解分为以下几个主要部分: **1. GUI概述** MTK GUI的概述主要包括以下几个屏幕组件和元素: 1. **Screen**:这是GUI的基础,代表设备的显示区域,可以有多个屏幕。 2. **Menu**:菜单是用户导航系统的...
MTK图片管理工具的开发是一项基础的软件工程任务,尤其对于那些处理大量图像数据的用户或者在MTK(MediaTek)设备上工作的人来说,这样的工具是必不可少的。MediaTek是一家知名的半导体公司,其芯片广泛应用于智能...
根据给定的文件信息,我们将深入探讨MTK平台开机流程应用指南中的关键知识点,这将帮助我们更好地理解MTK芯片组在移动设备启动过程中的作用和机制。 ### MTK平台开机流程 MTK(MediaTek)是全球领先的移动通信、...
9. **兼容性测试**: 在实际应用中,MTK DVD解码方案需经过严格的兼容性测试,确保其能在各种不同的DVD格式、播放器型号及操作系统环境下正常工作。 10. **优化与调试**: 设计过程中,可能会进行多次迭代,通过性能...
MTK camera 基本流程分析 MTK 平台 camera 架构主要由两部分组成:image sensor 驱动和 ispdriver。image sensor 驱动负责具体型号的 sensor 的 id 检测,上电,以及在 preview、capture、初始化、3A 等等功能设定...
MTK快充流程概述: MTK(MediaTek)快充技术是针对移动设备使用的快速充电技术,它能够加速移动设备电池的充电过程。MTK快充流程分为几个关键阶段:涓流充电、恒流充电以及恒压充电,这些阶段共同确保电池以安全和...
MTK平台移植Camera步骤详解 MTK平台移植Camera的步骤是一个复杂的过程,涉及到多个模块和配置文件的修改。本文将详细介绍MTK平台移植Camera的步骤,并对每一个步骤中的易错点、容易忽略点进行了介绍。 Step 1: ...
### MTK教程详解 #### 一、基础知识 **MTK平台**是 MediaTek Inc. 提供的一种集成化的手机开发平台,广泛应用于移动通信设备的研发。本文档《MMI实例培训教程》旨在通过一系列实例来帮助开发者深入理解并掌握MTK...
MTK MMI开发详解主要关注的是MediaTek平台上的用户接口开发,它涉及到多个关键组件和层次,旨在为开发者提供一个全面的视角来理解和构建在MTK设备上的应用。以下是对这些知识点的详细说明: 1. **MMI架构**:MMI...
MTK的TP兼容详解主要涉及的是在MTK(MediaTek)平台上如何实现触摸屏(TP)的驱动兼容性。在Android或Linux系统中,MTK的触摸屏驱动由多个组件协同工作来确保不同触摸IC(集成电路)的兼容性。本文将深入探讨MTK ...
**MTK MMI 开发(官方)详解** MTK(MediaTek)MMI,全称为 MediaTek Mobile Multimedia Interface,是联发科(MediaTek)为移动设备提供的多媒体接口框架。这一框架主要用于管理和控制移动设备上的多媒体资源,...