- int spriteGap = 30;
- var scanTypes = new string[]{".jpg", ".gif", ".png"};
- string workDirectory =
- Path.GetDirectoryName(this.Host.TemplateFile);
- /* 取得圖檔資訊 */
- List<ImageInfo> imageList = Directory
- .EnumerateFiles(Path.Combine(workDirectory, "icons"))
- .Where(path => scanTypes.Contains(Path.GetExtension(path)))
- .Select(path =>
- {
- var image = Image.FromFile(path);
- return new ImageInfo{
- FilePath = path,
- FileName = Path.GetFileName(path),
- IconImage = image,
- IconName = Path.GetFileNameWithoutExtension(path),
- TopOffset = 0,
- Width = image.Width,
- Height = image.Height,
- IsAnimated = ImageAnimator.CanAnimate(image),
- };
- })
- .OrderBy(info => info.IsAnimated)
- .ToList();
- /*檢查重複的圖檔名稱*/
- List<string> repeatList = imageList.GroupBy(info => info.IconName)
- .Where(g => g.Count() > 1)
- .SelectMany(g => g.Select(x => x.FileName))
- .ToList();
- if(repeatList.Count > 0){
- throw new Exception(
- "出現重複的圖檔名稱[" + String.Join(", ", repeatList) + "]"
- );
- }
- /* 製作 CSS Sprite */
- int sumHeight = imageList.Sum( info => info.Height);
- int spriteWidth = imageList.Max( info => info.Width);
- int spriteHeight = sumHeight + (imageList.Count - 1) * spriteGap;
- var bitmap = new Bitmap(spriteWidth, spriteHeight);
- using (Graphics graphics = Graphics.FromImage(bitmap))
- {
- int nextTop = 0;
- for(int i=0; i< imageList.Count; i++){
- /*忽略具有動畫的 GIF 圖片*/
- if(imageList[i].IsAnimated){ continue; }
- imageList[i].TopOffset = nextTop;
- graphics.DrawImage(imageList[i].IconImage, 0, nextTop);
- nextTop = nextTop + imageList[i].Height + spriteGap;
- }
- graphics.Save();
- }
- SaveOutput("icons.sprite.png");
- bitmap.Save(
- Path.Combine(workDirectory, "icons.sprite.png"),
- ImageFormat.Png
- );
- bitmap.Dispose();
下載完整程式: t4_make_icons_css.zip