ImageMagick_Create_JPEG() public method

Use ImageMagick to create a JPEG derivative file
public ImageMagick_Create_JPEG ( string Sourcefile, string Finalfile, int Width, int Height, long ParentLogId, string PackageName ) : void
Sourcefile string Source file
Finalfile string Final file
Width int Width restriction for the resulting jpeg
Height int Height restriction for the resulting jpeg
ParentLogId long Primary key to the parent log entery if this is performed by the builder
PackageName string Name of the package this file belongs to ( BibID : VID )
return void
        /// <summary> Creates all the image derivative files from original jpeg and tiff files </summary>
        /// <param name="Resource"> Incoming digital resource object </param>
        /// <returns> TRUE if processing can continue, FALSE if a critical error occurred which should stop all processing </returns>
        public override bool DoWork(Incoming_Digital_Resource Resource)
        {
            returnValue = true;

            string resourceFolder = Resource.Resource_Folder;
            string imagemagick_executable = MultiInstance_Builder_Settings.ImageMagick_Executable;

            string executing_directory = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase).Replace("file:\\","");
            string kakadu_directory = Path.Combine(executing_directory, "kakadu");

            // Are there images that need to be processed here?
            if (!String.IsNullOrEmpty(imagemagick_executable))
            {
                // Get the list of image files first
                List<string> imageFiles = new List<string>();
                foreach (string imageExtension in image_extensions)
                {
                    imageFiles.AddRange(Directory.GetFiles(resourceFolder, "*" + imageExtension));
                }

                // Only continue if some exist
                if (imageFiles.Count > 0)
                {
                    //// Build the list of files listed in the metadata
                    //Dictionary<string, SobekCM_File_Info> names_to_mets_file = new Dictionary<string, SobekCM_File_Info>(StringComparer.OrdinalIgnoreCase);
                    //List<SobekCM_File_Info> files = Resource.Metadata.Divisions.Physical_Tree.All_Files;
                    //foreach (SobekCM_File_Info thisFile in files)
                    //{
                    //    names_to_mets_file[thisFile.System_Name] = thisFile;
                    //}

                    // Step through all the image files and find the collection of page images
                    Dictionary<string, List<string>> imageRootFiles = new Dictionary<string, List<string>>( StringComparer.OrdinalIgnoreCase );
                    List<string> possibleThumbnails = new List<string>();
                    foreach (string thisImageFile in imageFiles)
                    {
                        // Skip .QC.JPG files
                        if (thisImageFile.IndexOf(".qc.jpg", StringComparison.OrdinalIgnoreCase) > 0)
                            continue;

                        // If this might be a thumbnail image, save it for the very end for analysis
                        if ((thisImageFile.IndexOf("thm.jpg", StringComparison.OrdinalIgnoreCase) > 0) && ( Path.GetFileNameWithoutExtension(thisImageFile).Length > 3 ))
                        {
                            // Save for final analysis
                            possibleThumbnails.Add(thisImageFile);
                        }
                        else
                        {
                            // Get this filename without the extension
                            string filename_sans_extension = Path.GetFileNameWithoutExtension(thisImageFile);

                            // Has this root, or image grouping, already been analyzed?
                            if (imageRootFiles.ContainsKey(filename_sans_extension))
                            {
                                imageRootFiles[filename_sans_extension].Add(thisImageFile);
                            }
                            else
                            {
                                imageRootFiles.Add(filename_sans_extension, new List<string> {thisImageFile});
                            }
                        }
                    }

                    // Now, re-analyze those files that could have potentially been a thumbnail jpeg
                    foreach (string thisPossibleThumbnail in possibleThumbnails)
                    {
                        // Get this filename without the extension
                        string filename_sans_extension = Path.GetFileNameWithoutExtension(thisPossibleThumbnail);

                        // Remove the final 'thm' from the name first and look for a match
                        string filename_sans_thumb_extension = filename_sans_extension.Substring(0, filename_sans_extension.Length - 3);

                        // Has this root, or image grouping, already been analyzed?
                        if (imageRootFiles.ContainsKey(filename_sans_thumb_extension))
                        {
                            imageRootFiles[filename_sans_thumb_extension].Add(thisPossibleThumbnail);
                        }
                        else
                        {
                            imageRootFiles.Add(filename_sans_extension, new List<string> { thisPossibleThumbnail });
                        }
                    }

                    // Create the image process object for creating
                    Image_Derivative_Creation_Processor imageProcessor = new Image_Derivative_Creation_Processor(imagemagick_executable, kakadu_directory, true, true, Settings.Resources.JPEG_Width, Settings.Resources.JPEG_Height, false, Settings.Resources.Thumbnail_Width, Settings.Resources.Thumbnail_Height, null);
                    imageProcessor.New_Task_String += imageProcessor_New_Task_String;
                    imageProcessor.Error_Encountered += imageProcessor_Error_Encountered;

                    // Step through each file grouping and look for the newest file and jpeg and thumbnail dates
                    string jpeg_file;
                    string jpeg_thumb_file;
                    string jpeg2000_file;
                    foreach (string thisImageRoot in imageRootFiles.Keys)
                    {
                        // Ready for the next set of images
                        jpeg_file = String.Empty;
                        jpeg_thumb_file = String.Empty;
                        jpeg2000_file = String.Empty;

                        // Get the list of all related files
                        List<string> theseImageFiles = imageRootFiles[thisImageRoot];

                        // Look for the jpeg and thumbnail derivatives
                        int image_index = 0;
                        while (image_index < theseImageFiles.Count)
                        {
                            // Get the extenxstion of this file
                            string extension = Path.GetExtension(theseImageFiles[image_index]).ToUpper();

                            // Was this a special image file type (i.e., jpeg or jpeg2000?)
                            if ((extension == ".JPG") || (extension == ".JP2"))
                            {
                                // If JPEG, does this appear to be the thumbnail?
                                if (extension == ".JPG")
                                {
                                    if (String.Compare(Path.GetFileNameWithoutExtension(theseImageFiles[image_index]), thisImageRoot + "thm", StringComparison.OrdinalIgnoreCase) == 0)
                                    {
                                        jpeg_thumb_file = theseImageFiles[image_index];
                                    }
                                    else
                                    {
                                        jpeg_file = theseImageFiles[image_index];
                                    }
                                }
                                else
                                {
                                    jpeg2000_file = theseImageFiles[image_index];
                                }

                                // Since this was a standard derivative file, remove it from the list (and don't icrement image_index)
                                theseImageFiles.RemoveAt(image_index);
                            }
                            else
                            {
                                // Since this looks like source image (and not a standard derivative)
                                // just keep it in the list and move to the next one
                                image_index++;
                            }
                        }

                        // Having separated the derivatives from the possible source files, let's determine if derivatives should be created
                        // based on the dates for the files
                        DateTime? jpeg_file_lastModTime = null;
                        if (!String.IsNullOrEmpty(jpeg_file))
                            jpeg_file_lastModTime = File.GetLastWriteTime(jpeg_file);

                        DateTime? jpeg_thumb_file_lastModTime = null;
                        if ( !String.IsNullOrEmpty(jpeg_thumb_file))
                            jpeg_thumb_file_lastModTime = File.GetLastWriteTime(jpeg_thumb_file);

                        DateTime? jpeg2000_file_lastModTime = null;
                        if ( !String.IsNullOrEmpty(jpeg2000_file))
                            jpeg2000_file_lastModTime = File.GetLastWriteTime(jpeg2000_file);

                        // Were there some ordinary source files left, that may need to be analyzed?
                        if (theseImageFiles.Count > 0)
                        {
                            // Keep track of newest source file and date
                            string newest_source_file = String.Empty;
                            DateTime newest_source_file_date = new DateTime(1900, 1, 1);

                            // Find the newest source file
                            foreach (string thisSourceFile in theseImageFiles)
                            {
                                DateTime lastModTime = File.GetLastWriteTime(thisSourceFile);
                                if (lastModTime.CompareTo(newest_source_file_date) > 0)
                                {
                                    newest_source_file_date = lastModTime;
                                    newest_source_file = thisSourceFile;
                                }
                            }

                            // Now, see if some of the basic derivatives are missing or too old
                            if (((!jpeg_file_lastModTime.HasValue) || (jpeg_file_lastModTime.Value.CompareTo(newest_source_file_date) < 0)) ||
                                ((!jpeg_thumb_file_lastModTime.HasValue) || (jpeg_thumb_file_lastModTime.Value.CompareTo(newest_source_file_date) < 0)) ||
                                ((!jpeg2000_file_lastModTime.HasValue) || (jpeg2000_file_lastModTime.Value.CompareTo(newest_source_file_date) < 0)))
                            {
                                // Create all the derivatives
                                string name_sans_extension = Path.GetFileNameWithoutExtension(newest_source_file);

                                // Create the JPEG derivatives from the JPEG2000
                                imageProcessor.ImageMagick_Create_JPEG(newest_source_file, resourceFolder + "\\" + name_sans_extension + "thm.jpg", Settings.Resources.Thumbnail_Width, Settings.Resources.Thumbnail_Height, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);
                                imageProcessor.ImageMagick_Create_JPEG(newest_source_file, resourceFolder + "\\" + name_sans_extension + ".jpg", Settings.Resources.JPEG_Width, Settings.Resources.JPEG_Height, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);

                                imageProcessor.Create_JPEG2000(newest_source_file, name_sans_extension + ".jp2", resourceFolder, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);

                                //// If the JPEG exists with width/height information clear the information
                                //if (names_to_mets_file.ContainsKey(name_sans_extension + ".jpg"))
                                //{
                                //    names_to_mets_file[name_sans_extension + ".jpg"].Height = 0;
                                //    names_to_mets_file[name_sans_extension + ".jpg"].Width = 0;
                                //}
                            }
                        }
                        else
                        {
                            // No derivate source files found, but we may build the derivatives from the JPEG2000 file
                            if (!String.IsNullOrEmpty(jpeg2000_file))
                            {
                                //if (( jpeg_file_lastModTime.HasValue ) && ( jpeg_file_lastModTime.Value.Month == 9 ) && ( jpeg_file_lastModTime.Value.Day == 6 ))

                                // Now, see if the other derivatives are missing or too old
                                if (((!jpeg_file_lastModTime.HasValue) || (jpeg_file_lastModTime.Value.CompareTo(jpeg2000_file_lastModTime) < 0)) ||
                                    ((!jpeg_thumb_file_lastModTime.HasValue) || (jpeg_thumb_file_lastModTime.Value.CompareTo(jpeg2000_file_lastModTime) < 0)))
                                {
                                    string name_sans_extension = Path.GetFileNameWithoutExtension(jpeg2000_file);

                                    //// Create a temporary, full-size file
                                    //string temp_file = resourceFolder + "\\" + name_sans_extension + "_sobektemp.tif";
                                    //imageProcessor.ImageMagick_Create_JPEG(jpeg2000_file, temp_file, -1, -1, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);

                                    // Create the JPEG derivatives from the JPEG2000
                                    imageProcessor.ImageMagick_Create_JPEG(jpeg2000_file, resourceFolder + "\\" + name_sans_extension + "thm.jpg", Settings.Resources.Thumbnail_Width, Settings.Resources.Thumbnail_Height, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);
                                    imageProcessor.ImageMagick_Create_JPEG(jpeg2000_file, resourceFolder + "\\" + name_sans_extension + ".jpg", Settings.Resources.JPEG_Width, Settings.Resources.JPEG_Height, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);

                                    //// If the JPEG exists with width/height information clear the information
                                    //if (names_to_mets_file.ContainsKey(name_sans_extension + ".jpg"))
                                    //{
                                    //    names_to_mets_file[name_sans_extension + ".jpg"].Height = 0;
                                    //    names_to_mets_file[name_sans_extension + ".jpg"].Width = 0;
                                    //}
                                }
                            }
                        }
                    }
                }
            }

            return returnValue;
        }
        /// <summary> Creates all the image derivative files from original jpeg and tiff files </summary>
        /// <param name="Resource"> Incoming digital resource object </param>
        /// <returns> TRUE if processing can continue, FALSE if a critical error occurred which should stop all processing </returns>
        public override bool DoWork(Incoming_Digital_Resource Resource)
        {
            returnValue = true;

            string resourceFolder = Resource.Resource_Folder;
            string bibID = Resource.BibID;
            string vid = Resource.VID;
            string imagemagick_executable = MultiInstance_Builder_Settings.ImageMagick_Executable;

            // Are there images that need to be processed here?
            if (!String.IsNullOrEmpty(imagemagick_executable))
            {
                // Get the list of jpeg and tiff files
                string[] jpeg_files = Directory.GetFiles(resourceFolder, "*.jpg");
                string[] tiff_files = Directory.GetFiles(resourceFolder, "*.tif");

                // Only continue if some exist
                if ((jpeg_files.Length > 0) || (tiff_files.Length > 0))
                {
                    string startupPath = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
                    if (startupPath == null)
                    {
                        OnError("Unable to find the startup path in CreateImageDerivativesModule!", String.Empty, String.Empty, -1);
                        return false;
                    }

                    string kakadu_path = Path.Combine(startupPath, "Kakadu");

                    // Create the image process object for creating
                    Image_Derivative_Creation_Processor imageProcessor = new Image_Derivative_Creation_Processor(imagemagick_executable, kakadu_path, true, true, Settings.Resources.JPEG_Width, Settings.Resources.JPEG_Height, false, Settings.Resources.Thumbnail_Width, Settings.Resources.Thumbnail_Height, null);
                    imageProcessor.New_Task_String += imageProcessor_New_Task_String;
                    imageProcessor.Error_Encountered += imageProcessor_Error_Encountered;

                    // Step through the JPEGS and ensure they have thumbnails (TIFF generation below makes them as well)
                    if (jpeg_files.Length > 0)
                    {
                        foreach (string jpegFile in jpeg_files)
                        {
                            FileInfo jpegFileInfo = new FileInfo(jpegFile);
                            string name = jpegFileInfo.Name.ToUpper();
                            if ((name.IndexOf("THM.JPG") < 0) && (name.IndexOf(".QC.JPG") < 0))
                            {
                                string name_sans_extension = jpegFileInfo.Name.Replace(jpegFileInfo.Extension, "");
                                if (!File.Exists(resourceFolder + "\\" + name_sans_extension + "thm.jpg"))
                                {
                                    imageProcessor.ImageMagick_Create_JPEG(jpegFile, resourceFolder + "\\" + name_sans_extension + "thm.jpg", Settings.Resources.Thumbnail_Width, Settings.Resources.Thumbnail_Height, Resource.BuilderLogId, Resource.BibID + ":" + Resource.VID);
                                }
                            }
                        }
                    }

                    // Step through any TIFFs as well
                    if (tiff_files.Length > 0)
                    {
                        // Do a complete image derivative creation process on these TIFF files
                        imageProcessor.Process(resourceFolder, bibID, vid, tiff_files, Resource.BuilderLogId);

                        // Since we are actually creating page images here (most likely) try to add
                        // them to the package as well
                        foreach (string thisTiffFile in tiff_files)
                        {
                            // Get the name of the tiff file
                            FileInfo thisTiffFileInfo = new FileInfo(thisTiffFile);
                            string tiffFileName = thisTiffFileInfo.Name.Replace(thisTiffFileInfo.Extension, "");

                            // Get matching files
                            string[] matching_files = Directory.GetFiles(resourceFolder, tiffFileName + ".*");

                            // Now, step through all these files
                            foreach (string derivativeFile in matching_files)
                            {
                                // If this is a page image type file, add it
                                FileInfo derivativeFileInfo = new FileInfo(derivativeFile);
                                if (Settings.Page_Image_Extensions.Contains(derivativeFileInfo.Extension.ToUpper().Replace(".", "")))
                                    Resource.NewImageFiles.Add(derivativeFileInfo.Name);
                            }
                        }
                    }
                }
            }

            return returnValue;
        }