Archive

Posts Tagged ‘imagemagick’

usplash主题制作问题

August 20th, 2009 Comments off

Debian下目前有3个可以用的usplash主题包,分别是usplash-theme-debian,debian-edu-artwork-usplash,brdesktop-artwork-usplash。目前在lenny下制作出来的效果都有问题。截图:

usplash

为了解决这个问题,我先分析了usplash主题的制作原理。usplash的主题制作过程大概如下:

  • 由一个svg图,分别生成1024×876,800×600,640×480等分辨率下的背景图片。其实也可以不用svg,但非矢量图缩放效果可能不佳。也可以手动PS不同分辨率下的背景图片,也就不用借助svg的缩放了;下图是一个背景图:

background_640x480

  • 编辑生成一个进度条的png文件。图像中除进度条部分,其他应该是透明色;下图是用gimp编辑进度条的透明色效果:

progress

  • 将不同分辨率下的背景图和进度条叠加,生成2种叠加后的进度条效果,分别代表"进度为0"和"进度为100%"两种状态;

progressbg_640x480

progressfg_640x480

  • 统一所有图片的调色板。包括不同分辨率下的背景图、进度条效果图。下面是用gimp编辑图片看到的调色板:

palette

  • 将png图片转换为c文件
  • 将c文件编译链接成so文件

而产生前面截图那样的错误,是因为图片的调色板没有统一。而调色板不统一的原因,是因为usplash用的图片转换工具修改了统一调色板的方法。

本来,usplash 用的统一调色板的方法,是通过imagemagick提供的convert命令,先将png转换到gif,再转换回png的方法。(可能是因为convert对png格式的调色板支持不好)。方法如下:

convert image.png +dither -map ./cmap.gif gif:-
  | convert gif:- image.png

后来这种方法不管用了。原因是从gif转回png格式时,convert不再保留调色板。

经过网上的搜索,发现新版本的imagemagick应该用下面的命令设置调色板:

convert +dither image.png -type Palette -depth 8 -map cmap.gif image.png

修改Makefile中相关语句后,再次编译usplash主题,就会出现正确的效果了:

usplashgood

附usplash-theme-debian的patch:

--- a/Makefile	2009-08-20 00:51:49.000000000 +0800
+++ b/Makefile	2009-08-20 00:34:28.000000000 +0800
@@ -88,8 +88,8 @@
 
 %.c: %.png cmap.gif
 	$(E) "  PNGSRC  " $@
-	$(Q) convert $< +dither -map cmap.gif gif:- | \
-	     convert gif:- $<
+	$(Q) convert +dither $< -type Palette -depth 8 -map cmap.gif $<.new
+	$(Q) mv $<.new $<
 	$(Q) pngtousplash $< > $@
 
 #cmap.gif: background.svg progress.png
Categories: 开源软件 Tags: , ,