[PHP] url, base64, sprite 三种格式的 icons.css 生成器
时间:2014-07-24 10:13 来源: 我爱IT技术网 作者:山风
先做一个假设,如果 icon 的文件名就是 css 的 class 样式名称,那么我们只要扫瞄文件夹的 Icon 图档,然后产生对应的 CSS 文件,这样就可以省去制作 Sprite 图档跟维护 CSS 对应的问题。
第一种 url 格式只是取得路径的问题。
第二种 base64 格式可以通过 base64_encode(file_get_contents($path)); 就简单的达成。
第三种 sprite 格式则使用 Imagick 去处理,会比较快乐。
接着以下就是如何达成的程序片段:
- <?php
- /*把目录改变到当前文件下*/
- chdir(dirname(__FILE__));
- /*Sprite 图与图的间距*/
- $spriteGap = 30;
- /*=[ 取得图档信息 ]=*/
- $maxWidth = 0;
- $maxHeight = 0;
- $nextTop = 0;
- $imageList = array();
- foreach ( glob('icons/*.{png,jpg,gif}',GLOB_BRACE) as $path )
- {
- $image = new Imagick($path);
- $name = pathinfo($path,PATHINFO_FILENAME);
- if(isset($imageList[$name])){
- throw new Exception("图片名称重复 [ $name ]");
- }
- $info = array(
- '{top}' => $nextTop,
- '{image}' => $image,
- '{width}' => $image->getImageWidth(),
- '{height}' => $image->getImageHeight(),
- '{name}' => $name,
- '{path}' => $path,
- '{isAnimate}' => false
- );
- $header = '';
- switch($image->getImageFormat()){
- case "PNG":
- $header = 'data:image/png;base64,'; break;
- case "JPEG":
- $header = 'data:image/jpeg;base64,'; break;
- case "GIF":
- $header = 'data:image/gif;base64,'; break;
- default: break;
- }
- $info['{uri}'] = $header.base64_encode(file_get_contents($path));
- $maxWidth = max($maxWidth, $info['{width}']);
- $maxHeight = max($maxHeight, $info['{height}']);
- /*检查图片是否为动画*/
- $frameNum = 0;
- foreach($image->deconstructImages() as $i) {
- $frameNum++;
- if ($frameNum > 1) {
- $info['{isAnimate}'] = true;
- break;
- }
- }
- if(!$info['{isAnimate}']){
- $nextTop += $info['{height}'] + $spriteGap;
- }
- $imageList[$name] = $info;
- }
- /*=[ 制作 CSS Sprite 图档 ]=*/
- $spriteImage = new Imagick();
- $spriteImage->newImage($maxWidth, $nextTop, new ImagickPixel());
- $spriteImage->setImageFormat('png');
- $spriteImage->paintTransparentImage(new ImagickPixel(), 0.0, 0);
- foreach ($imageList as $name => $info)
- {
- if($info['{isAnimate}']){ continue; } /* 忽略 GIF 动画 */
- /* 复制 Icon 图档到 Sprite */
- $spriteImage->compositeImage(
- $info['{image}'],
- $info['{image}']->getImageCompose(),
- 0,
- $info['{top}']
- );
- $info['{image}']->destroy();
- unset($imageList[$name]['{image}']);
- }
- $spriteImage->writeImage('icons.sprite.png');
- $spriteImage->destroy();
- $spriteImage = null;
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
