using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Drawing; using System.Drawing.Imaging; namespace Thumbnailer { class Program { static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine("thumbnailer [folder]"); return; } string imageDir = args[0]; if (!Directory.Exists(imageDir)) { Console.WriteLine("Directory does not exist: {0}", imageDir); return; } StringBuilder htmlBuilder = new StringBuilder(); WriteHeader(htmlBuilder); ProcessFileExtension(imageDir, "*.jpg", htmlBuilder); ProcessFileExtension(imageDir, "*.mpo", htmlBuilder); ProcessFileExtension(imageDir, "*.png", htmlBuilder); ProcessFileExtension(imageDir, "*.gif", htmlBuilder); WriteFooter(htmlBuilder); File.WriteAllText(Path.Combine(imageDir, "index.html"), htmlBuilder.ToString()); } public static void ProcessFileExtension(string imageDir, string extension, StringBuilder htmlBuilder) { string[] imageFiles = Directory.GetFiles(imageDir, extension); foreach (string imageFile in imageFiles) { WriteThumbnail(imageFile); CreateImageHTML(imageFile, htmlBuilder); } } public static void WriteThumbnail(string imageFile) { Bitmap fullImage = new Bitmap(imageFile); Size scaledSize = ScaleSize(fullImage.Size, new Size(150, 150)); Bitmap thumbnail = (Bitmap)fullImage.GetThumbnailImage(scaledSize.Width, scaledSize.Height, null, IntPtr.Zero); string thumbPath = Path.Combine(Path.GetDirectoryName(imageFile), "Thumbs"); if(!Directory.Exists(thumbPath)) { Directory.CreateDirectory(thumbPath); } string thumbFile = Path.Combine(thumbPath, Path.GetFileName(imageFile)); thumbFile = Path.ChangeExtension(thumbFile, ".jpg"); thumbnail.Save(thumbFile, ImageFormat.Jpeg); fullImage.Dispose(); thumbnail.Dispose(); } public static Size ScaleSize(Size original, Size scaleTo) { if (original.Height == 0 || original.Width == 0) { //This can be a smarter special case. For most cases, //there's no reason the other dimension can't still be scaled. return Size.Empty; } double xScale = ((double)scaleTo.Width / (double)original.Width); if ((xScale * original.Height) <= scaleTo.Height) { return new Size((int)(xScale * original.Width), (int)(xScale * original.Height)); } double yScale = ((double)scaleTo.Height / (double)original.Height); return new Size((int)(yScale * original.Width), (int)(yScale * original.Height)); } public static void CreateImageHTML(string imageFile, StringBuilder builder) { string imageName = Path.GetFileName(imageFile); builder.Append("
"); builder.AppendLine(); builder.AppendFormat("

{0}

", imageName); builder.AppendLine(); builder.AppendFormat("", imageName, Path.ChangeExtension(imageName, ".jpg")); builder.AppendLine(); builder.Append("
"); builder.AppendLine(); builder.AppendLine(); } public static void WriteHeader(StringBuilder builder) { builder.AppendLine(""); builder.AppendLine("Image Thumbnails"); builder.AppendLine(""); builder.AppendLine(""); builder.AppendLine(""); builder.AppendLine(); builder.AppendLine("
"); builder.AppendLine("Image Thumbnails
"); builder.AppendLine("
"); builder.AppendLine(); builder.AppendLine("
"); builder.AppendLine("
"); builder.AppendLine("
"); builder.AppendLine(); } public static void WriteFooter(StringBuilder builder) { builder.AppendLine(); builder.AppendLine("
"); builder.AppendLine("
"); builder.AppendLine("
"); builder.AppendLine(""); builder.AppendLine(""); } } }