public DeepZoomCollection(Settings settings) { _settings = settings; _imageFormatName = _settings.PostImageEncoding.GetName (); // the <Size> element is the same for all <I> elements #region <Size Width="800" Height="400" /> _sizeNode = new XElement (SizeNodeName); _sizeNode.SetAttributeValue ("Width", settings.ItemImageSize.Width); _sizeNode.SetAttributeValue ("Height", settings.ItemImageSize.Height); #endregion }
public static int Main (string[] args) { // TODO: initialize Settings instance from app.config and/or command-line var settings = new Settings { ItemImageSize = new Size(800, 400), TileSize = 254, TileOverlap = 1, XmlReaderSettings = new XmlReaderSettings { #if DEBUG IgnoreWhitespace = false, #else IgnoreWhitespace = true, #endif }, XmlWriterSettings = new XmlWriterSettings { OmitXmlDeclaration = true, NewLineChars = "\n", #if DEBUG Indent = true, IndentChars = " ", #else NewLineHandling = NewLineHandling.Entitize, #endif }, /* DatabaseConnectionString = "Data Source=Blackberry;Initial Catalog=SuperUser;Integrated Security=True", SiteDomain = "superuser.com", MaximumNumberOfItems = 185520, HighestId = 207698, */ DatabaseConnectionString = "Data Source=Blackberry;Initial Catalog=Photography;Integrated Security=True", SiteDomain = "photo.stackexchange.com", MaximumNumberOfItems = 936, HighestId = 4479, AbsoluteWorkingFolder = Path.GetFullPath (WorkingFolderName), AbsoluteOutputFolder = Path.GetFullPath (OutputFolderName), PostImageEncoding = ImageFormat.Png, }; var program = new Program (settings); program.Generate (); return 0; }
public DeepZoomImage(Settings settings) { _settings = settings; _maximumLevel = DetermineMaximumLevel (settings.ItemImageSize); }
public Program(Settings settings) { _settings = settings; }
internal static void PivotizeTag (PostRepository postRepository, Tag tag, Settings settings) { var workingPath = Path.GetFullPath (WorkingFolderName); var outputPath = Path.GetFullPath (OutputFolderName); var relativeBinnedCxmlPath = tag.ComputeBinnedPath (".cxml"); var absoluteBinnedCxmlPath = Path.Combine (outputPath, relativeBinnedCxmlPath); Directory.CreateDirectory (Path.GetDirectoryName (absoluteBinnedCxmlPath)); using (var outputStream = new FileStream (absoluteBinnedCxmlPath, FileMode.Create, FileAccess.Write, FileShare.Read)) { var postIds = postRepository.RetrievePostIds (tag.Id); var streamReaders = postIds.Map (postId => { var relativeBinnedXmlPath = Post.ComputeBinnedPath (postId, ".xml", settings.FileNameIdFormat); var absoluteBinnedXmlPath = Path.Combine (workingPath, relativeBinnedXmlPath); var sr = new StreamReader (absoluteBinnedXmlPath); return sr; } ); PivotizeTag (tag, streamReaders, outputStream, settings.SiteDomain); } }
public static int Main (string[] args) { // TODO: initialize Settings instance from app.config and/or command-line var settings = new Settings { ItemImageSize = new Size(800, 400), TileSize = 254, TileOverlap = 1, /* DatabaseConnectionString = "Data Source=Blackberry;Initial Catalog=SuperUser;Integrated Security=True", SiteDomain = "superuser.com", MaximumNumberOfItems = 185520, HighestId = 207698, */ DatabaseConnectionString = "Data Source=Blackberry;Initial Catalog=Photography;Integrated Security=True", SiteDomain = "photo.stackexchange.com", MaximumNumberOfItems = 936, HighestId = 4479, PostImageEncoding = ImageFormat.Png, }; using (var tagsConnection = new SqlConnection(settings.DatabaseConnectionString)) using (var postsConnection = new SqlConnection (settings.DatabaseConnectionString)) { tagsConnection.Open (); postsConnection.Open (); var tagRepository = new TagRepository (tagsConnection); var postRepository = new PostRepository (postsConnection); #region Phase 1: Convert Posts (collection items) into temporary raw artifacts CleanWorkingFolder (); CreateRawItems (settings, postRepository); GeneratePostImageResizes (settings, postRepository); #endregion #region Phase 2: Slice Post (collection item) images to create final .dzi files and sub-folders GenerateImageSlices (settings, postRepository); GenerateImageManifests (settings, postRepository); #endregion #region Phase 3: Convert Tags (collections) into final .cxml and .dzc files AssembleCollections (settings, tagRepository, postRepository); #endregion } return 0; }
internal static void GeneratePostImageResizes (Settings settings, PostRepository postRepository) { var size = settings.ItemImageSize; var maximumLevel = DeepZoomImage.DetermineMaximumLevel (size); var workingPath = Path.GetFullPath (WorkingFolderName); var imageFormat = settings.PostImageEncoding; var extension = imageFormat.ToString ().ToLower (); var fileNameIdFormat = settings.FileNameIdFormat; foreach (var postId in postRepository.RetrievePostIds ()) { var relativeBinnedImagePath = Post.ComputeBinnedPath (postId, extension, fileNameIdFormat); var absoluteBinnedImagePath = Path.Combine (workingPath, relativeBinnedImagePath); var relativeBinnedImageFolder = Post.ComputeBinnedPath (postId, null, fileNameIdFormat) + "_files"; var absoluteBinnedImageFolder = Path.Combine (workingPath, relativeBinnedImageFolder); Directory.CreateDirectory (absoluteBinnedImageFolder); using (var inputStream = new FileStream (absoluteBinnedImagePath, FileMode.Open, FileAccess.Read, FileShare.Read)) using (var sourceBitmap = new Bitmap (inputStream)) { GeneratePostImageResizes (sourceBitmap, size, maximumLevel, (level, resizedBitmap) => { var levelImageName = "{0}.{1}".FormatInvariant (level, extension); var levelImagePath = Path.Combine (absoluteBinnedImageFolder, levelImageName); using (var outputStream = new FileStream (levelImagePath, FileMode.Create, FileAccess.Write, FileShare.Read)) { resizedBitmap.Save (outputStream, imageFormat); } } ); } } }
internal static void CreateRawItems (Settings settings, PostRepository postRepository) { var workingPath = Path.GetFullPath (WorkingFolderName); Directory.CreateDirectory (workingPath); Page template; using (var stream = AssemblyExtensions.OpenScopedResourceStream<Program> ("Template.xaml")) { template = (Page) XamlReader.Load (stream); template.Width = settings.ItemImageSize.Width; template.Height = settings.ItemImageSize.Height; } var imageFormat = settings.PostImageEncoding; var imageExtension = imageFormat.ToString ().ToLower (); var posts = postRepository.RetrievePosts (); foreach (var post in posts) { var relativeBinnedXmlPath = post.ComputeBinnedPath (".xml", settings.FileNameIdFormat); var absoluteBinnedXmlPath = Path.Combine (workingPath, relativeBinnedXmlPath); Directory.CreateDirectory (Path.GetDirectoryName (absoluteBinnedXmlPath)); var element = PivotizePost (post); using (var outputStream = new FileStream (absoluteBinnedXmlPath, FileMode.Create, FileAccess.Write, FileShare.Read)) { using (var writer = new ItemWriter (outputStream, ItemWriterSettings)) { element.Save (writer); } } var relativeBinnedImagePath = post.ComputeBinnedPath (imageExtension, settings.FileNameIdFormat); var absoluteBinnedImagePath = Path.Combine (workingPath, relativeBinnedImagePath); Directory.CreateDirectory (Path.GetDirectoryName (absoluteBinnedImagePath)); using (var outputStream = new FileStream (absoluteBinnedImagePath, FileMode.Create, FileAccess.Write, FileShare.Read)) { ImagePost (post, template, imageFormat, outputStream); } } }
internal static void AssembleCollections (Settings settings, TagRepository tagRepository, PostRepository postRepository) { var outputPath = Path.GetFullPath (OutputFolderName); var imageFormat = settings.PostImageEncoding; var imageFormatName = imageFormat.ToString ().ToLower (); var fileNameIdFormat = settings.FileNameIdFormat; var width = settings.ItemImageSize.Width; var height = settings.ItemImageSize.Height; var tags = tagRepository.RetrieveTags (); foreach (var tag in tags) { // TODO: consider using postIds, currently computed below PivotizeTag (postRepository, tag, settings); var postIds = new List<int> (postRepository.RetrievePostIds (tag.Id)); var relativePathToCollectionManifest = Tag.ComputeBinnedPath (tag.Name, ".dzc"); var absolutePathToCollectionManifest = Path.Combine (outputPath, relativePathToCollectionManifest); var relativePathToRoot = relativePathToCollectionManifest.RelativizePath (); CreateCollectionManifest (postIds, absolutePathToCollectionManifest, imageFormatName, relativePathToRoot, fileNameIdFormat, width, height); CreateCollectionTiles (tag, outputPath, postIds, imageFormat, fileNameIdFormat, outputPath); } }
internal static void GenerateImageSlices(Settings settings, PostRepository postRepository) { var size = settings.ItemImageSize; var maximumLevel = DeepZoomImage.DetermineMaximumLevel (size); var imageFormat = settings.PostImageEncoding; var imageExtension = imageFormat.ToString ().ToLower (); var fileNameIdFormat = settings.FileNameIdFormat; foreach (var postId in postRepository.RetrievePostIds ()) { SlicePostImage (postId, size, maximumLevel, imageExtension, fileNameIdFormat, imageFormat, settings.TileSize, settings.TileOverlap); } }
internal static void GenerateImageManifests (Settings settings, PostRepository postRepository) { var outputPath = Path.GetFullPath (OutputFolderName); var fileNameIdFormat = settings.FileNameIdFormat; var imageNode = GenerateImageManifest (settings.TileSize, settings.TileOverlap, settings.PostImageEncoding.ToString ().ToLower (), settings.ItemImageSize.Width, settings.ItemImageSize.Height); var sb = new StringBuilder (); using (var writer = XmlWriter.Create (sb, WriterSettings)) { Debug.Assert (writer != null); imageNode.WriteTo (writer); } var imageManifest = sb.ToString (); foreach (var postId in postRepository.RetrievePostIds ()) { var relativeBinnedImageManifestPath = Post.ComputeBinnedPath (postId, "dzi", fileNameIdFormat); var absoluteBinnedImageManifestPath = Path.Combine (outputPath, relativeBinnedImageManifestPath); Directory.CreateDirectory (Path.GetDirectoryName (absoluteBinnedImageManifestPath)); File.WriteAllText (absoluteBinnedImageManifestPath, imageManifest, Encoding.UTF8); } }