第一種 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;
下載完整程式: php_make_icons_css.zip
0 回應:
張貼留言