/// <summary> /// Get sprites for image files. /// </summary> /// <param name="files">The component images for the sprite.</param> /// <returns>A list of css sprites</returns> public virtual List <SpriteElement> ProcessFiles(IEnumerable <ImageFile> files) { var spriteElements = new List <SpriteElement>(); foreach (var file in files) { var filePath = new Uri(PathProvider.MapPath(file.FilePath)).LocalPath; var fileInfo = new FileInfo(filePath); using (var reader = RetryableFileOpener.OpenFileStream(fileInfo, 5, FileMode.Open, FileAccess.Read, FileShare.Read)) { var spriteElement = new SpriteElement(file.Name, reader); spriteElements.Add(spriteElement); } } return(spriteElements); }
/// <summary> /// Get sprites for image files. /// </summary> /// <param name="files">The component images for the sprite.</param> /// <returns>A list of css sprites</returns> public virtual List<SpriteElement> ProcessFiles(IEnumerable<ImageFile> files) { var spriteElements = new List<SpriteElement>(); foreach (var file in files) { var filePath = new Uri(PathProvider.MapPath(file.FilePath)).LocalPath; var fileInfo = new FileInfo(filePath); using (var reader = RetryableFileOpener.OpenFileStream(fileInfo, 5, FileMode.Open, FileAccess.Read, FileShare.Read)) { var spriteElement = new SpriteElement(file.Name, reader); spriteElements.Add(spriteElement); } } return spriteElements; }
/// <summary> /// Combine the images into a sprite image. /// </summary> /// <param name="imageOutputPath">Sprite image output path.</param> /// <param name="spriteImageUrl">Sprite image url.</param> /// <param name="cssOutputPath">Sprite css output path.</param> /// <param name="files">The component images for the sprite.</param> private static void ProcessFiles(string imageOutputPath, string spriteImageUrl, string cssOutputPath, IEnumerable <ImageFile> files) { var spriteElements = new List <SpriteElement>(); foreach (var file in files) { var fileInfo = new FileInfo(HostingEnvironment.MapPath(file.FilePath)); using (var reader = FileHelper.OpenFileStream(fileInfo, 5, FileMode.Open, FileAccess.Read, FileShare.Read)) { var spriteElement = new SpriteElement(file.Name, reader); spriteElements.Add(spriteElement); } } var etag = string.Empty; using (var image = GetCssSpriteImage(spriteElements)) { using (var writer = new MemoryStream()) { image.Save(writer, ImageFormat.Png); writer.Flush(); etag = HashHelper.CalculateMd5Etag(writer); var imageFileInfo = new FileInfo(HostingEnvironment.MapPath(imageOutputPath)); //We might be competing with the web server for the output file, so try to overwrite it at regular intervals using (var outputFile = FileHelper.OpenFileStream(imageFileInfo, 5, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { var overwrite = true; if (outputFile.Length > 0) { var outputFileHash = HashHelper.CalculateMd5Etag(outputFile); overwrite = (etag != outputFileHash); } if (overwrite) { writer.Seek(0, SeekOrigin.Begin); outputFile.SetLength(writer.Length); //Truncate current file outputFile.Seek(0, SeekOrigin.Begin); var bufferSize = Convert.ToInt32(Math.Min(writer.Length, BufferSize)); var buffer = new byte[bufferSize]; int bytesRead; while ((bytesRead = writer.Read(buffer, 0, bufferSize)) > 0) { outputFile.Write(buffer, 0, bytesRead); } outputFile.Flush(); } } } } var cssSpriteImageUrl = string.IsNullOrEmpty(spriteImageUrl) ? VirtualPathUtility.ToAbsolute(imageOutputPath) : spriteImageUrl; var css = GetCssSpriteCss(spriteElements, etag, cssSpriteImageUrl); using (var writer = new MemoryStream()) { var uniEncoding = Encoding.Default; if (!string.IsNullOrEmpty(css)) { writer.Write(uniEncoding.GetBytes(css), 0, uniEncoding.GetByteCount(css)); } var cssFileInfo = new FileInfo(HostingEnvironment.MapPath(cssOutputPath)); using (var outputFile = FileHelper.OpenFileStream(cssFileInfo, 5, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) { var overwrite = true; if (outputFile.Length > 0) { var newOutputFileHash = HashHelper.CalculateMd5Etag(writer); var outputFileHash = HashHelper.CalculateMd5Etag(outputFile); overwrite = (newOutputFileHash != outputFileHash); } if (overwrite) { writer.Seek(0, SeekOrigin.Begin); outputFile.SetLength(writer.Length); //Truncate current file outputFile.Seek(0, SeekOrigin.Begin); var bufferSize = Convert.ToInt32(Math.Min(writer.Length, BufferSize)); var buffer = new byte[bufferSize]; int bytesRead; while ((bytesRead = writer.Read(buffer, 0, bufferSize)) > 0) { outputFile.Write(buffer, 0, bytesRead); } outputFile.Flush(); } } } }