android开机动画包制作工具实现
2016-06-02 10:52
555 查看
android开机动画包制作
由于项目的需要,要制作LOGO有光亮的闪烁,网上查了资料,都是介绍 desc.txt 文件的格式,但对于每一帧的图片制作没有现成的工具,所以本人试着自己先一个,只要满足自己的需求(logo光来回扫动)就行,其他复杂的情况不考虑。首先是 desc.txt 的实现:
1024 600 16
p 0 0 part0
很简单,分辨率,播放帧率都有软件自动生成,分辨率根据logo的大小来设定。
接着,就是怎么实现每一帧图片了,首先,叫美工画了3张图,一张logo,一张光,还有一张掩膜,举个例子
logo图片:
光:
掩膜:
先让 logo图片和光做alpha运算,得到一张黑色底图都带光的图片:
为了去掉黑色区域的白光,所以最后与掩膜做alpha叠加,变为:
原理基本就这样,然后光从左到右移动,生成一张张图片,
我是用Python写的,看源码吧:
# coding=utf-8 __author__ = 'snomy' import os import shutil import Image import ImageFilter import zipfile import sys # ---------------------- 函数 -------------------------- def isFullBlack(xy, image): point_cnt = 0 xy_left = (xy[0]-1, xy[1]+0) xy_right = (xy[0]+1, xy[1]+0) xy_up = (xy[0]+0, xy[1]-1) xy_bottom = (xy[0]+0, xy[1]+1) lst = [xy, xy_left, xy_right, xy_up, xy_bottom] for i in lst: xxx = i[0] yyy = i[1] if i[0] < 0: xxx = 0 if i[0] >= image.size[0]: xxx = xy[0] if i[1] < 0: yyy = 0 if i[1] >= image.size[1]: yyy = xy[1] if image.getpixel((xxx, yyy)) != (0, 0, 0, 255): point_cnt += 1 return point_cnt # ---------------------- 程序执行 -------------------------- # 步进多少像数分割图片 MOVE_PIX = 32 # 判断logo.png是否存在,不存在退出 if not os.path.exists("logo.png"): print "logo.png is not existent" sys.exit() # 判断guang.png是否存在,不存在退出 if not os.path.exists("guang.png"): print "guang.png is not existent" sys.exit() # 1. 输入每秒显示几张 if len(sys.argv) >= 2: pics_per_second = eval(sys.argv[1]) if pics_per_second <= 0: print "too small" sys.exit() if pics_per_second > 60: print "too large" sys.exit() if 1<= pics_per_second <= 60: print pics_per_second, "frame/s" else: while True: pics_per_second = input("frame/s: ") if pics_per_second <= 0: print "too small" if pics_per_second > 60: print "too large" if 1<= pics_per_second <= 60: break Im = Image.open("logo.png") print "logo.png" print Im.mode, Im.size, Im.format Im_guang = Image.open("guang.png") print "guang.png" print Im_guang.mode, Im_guang.size, Im_guang.format # 先删除文件夹 if os.path.exists("part0"): shutil.rmtree("part0") # 创建文件夹 os.mkdir("part0") # 判断文件是否存在 if os.path.exists("desc.txt"): os.remove("desc.txt") # 2. 生成 desc.txt 文件 hDescFile = open("desc.txt", mode='w') hDescFile.write("%d %d %d\n" % (Im.size[0], Im.size[1], pics_per_second)) hDescFile.write("p 0 0 part0\n") hDescFile.close() # 2.5 判断是否存在掩膜图片,没有则生成掩膜图片,有则使用现有的 img_mask = Image.new('RGBA', Im.size) if not os.path.exists("mask.png"): print "mask.png is not existent" img_mask.paste(Im, (0, 0)) for height in range(img_mask.size[1]): for width in range(img_mask.size[0]): #if img_mask.getpixel((width, height)) != (0, 0, 0, 255): cnt = isFullBlack((width, height), Im) if cnt == 5: img_mask.putpixel((width, height), ((0, 0, 0, 0))) elif cnt == 4: img_mask.putpixel((width, height), ((0, 0, 0, 50))) elif cnt == 3: img_mask.putpixel((width, height), ((0, 0, 0, 100))) elif cnt == 2: img_mask.putpixel((width, height), ((0, 0, 0, 150))) elif cnt == 1: img_mask.putpixel((width, height), ((0, 0, 0, 200))) #img_mask.save("img_mask.png") else: print "use mask.png" img_mask = Image.open("mask.png") print img_mask.mode, img_mask.size, img_mask.format # 3. 生成 每张图片 index = 0 while True: if MOVE_PIX*index > Im.size[0]: break new_img = Image.new('RGB', Im.size) new_img.paste(Im, (0, 0)) new_img.paste(Im_guang, (MOVE_PIX*index, 0), Im_guang) new_img.paste(img_mask, (0, 0), img_mask) save_path = "part0/%04d.png" % index print save_path new_img.save(save_path, "PNG") index += 1 #end while # 4. 生成zip文件 if os.path.exists("bootanimation.zip"): os.remove("bootanimation.zip") zpfd = zipfile.ZipFile("bootanimation.zip", mode='w', compression=zipfile.ZIP_STORED) zpfd.write("desc.txt") startdir = "part0" for dirpath, dirnames, filenames in os.walk(startdir): for filename in filenames: zpfd.write(os.path.join(dirpath, filename)) zpfd.close() print " -------- make bootanimation.zip OK --------" # 5. 清理文件 if os.path.exists("part0"): shutil.rmtree("part0") if os.path.exists("desc.txt"): os.remove("desc.txt")
OK,完成了,工具已上传,大家有需要的可以去下 http://download.csdn.net/detail/snomy/9538784
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories