예제 #1
0
 public virtual void TestToString()
 {
     Com.Drew.Metadata.Directory directory = new ExifIFD0Directory();
     Sharpen.Tests.AreEqual("Exif IFD0 Directory (0 tags)", Sharpen.Extensions.ConvertToString(directory));
     directory.SetString(1, "Tag 1");
     Sharpen.Tests.AreEqual("Exif IFD0 Directory (1 tag)", Sharpen.Extensions.ConvertToString(directory));
     directory.SetString(2, "Tag 2");
     Sharpen.Tests.AreEqual("Exif IFD0 Directory (2 tags)", Sharpen.Extensions.ConvertToString(directory));
 }
                internal Row(MarkdownTableOutputHandler _enclosing, [NotNull] FilePath file, [NotNull] Com.Drew.Metadata.Metadata metadata, [NotNull] string relativePath)
                {
                    this._enclosing   = _enclosing;
                    this.file         = file;
                    this.metadata     = metadata;
                    this.relativePath = relativePath;
                    ExifIFD0Directory      ifd0Dir   = metadata.GetFirstDirectoryOfType <ExifIFD0Directory>();
                    ExifSubIFDDirectory    subIfdDir = metadata.GetFirstDirectoryOfType <ExifSubIFDDirectory>();
                    ExifThumbnailDirectory thumbDir  = metadata.GetFirstDirectoryOfType <ExifThumbnailDirectory>();

                    if (ifd0Dir != null)
                    {
                        this.manufacturer = ifd0Dir.GetDescription(ExifIFD0Directory.TagMake);
                        this.model        = ifd0Dir.GetDescription(ExifIFD0Directory.TagModel);
                    }
                    bool hasMakernoteData = false;

                    if (subIfdDir != null)
                    {
                        this.exifVersion = subIfdDir.GetDescription(ExifSubIFDDirectory.TagExifVersion);
                        hasMakernoteData = subIfdDir.ContainsTag(ExifSubIFDDirectory.TagMakernote);
                    }
                    if (thumbDir != null)
                    {
                        int?width  = thumbDir.GetInteger(ExifThumbnailDirectory.TagImageWidth);
                        int?height = thumbDir.GetInteger(ExifThumbnailDirectory.TagImageHeight);
                        this.thumbnail = width != null && height != null?Sharpen.Extensions.StringFormat("Yes (%s x %s)", width, height) : "Yes";
                    }
                    foreach (Com.Drew.Metadata.Directory directory in metadata.GetDirectories())
                    {
                        if (directory.GetType().FullName.Contains("Makernote"))
                        {
                            this.makernote = Sharpen.Extensions.Trim(directory.GetName().Replace("Makernote", string.Empty));
                        }
                    }
                    if (this.makernote == null)
                    {
                        this.makernote = hasMakernoteData ? "(Unknown)" : "N/A";
                    }
                }
        /// <summary>An application entry point.</summary>
        /// <remarks>
        /// An application entry point.  Takes the name of one or more files as arguments and prints the contents of all
        /// metadata directories to <code>System.out</code>.
        /// <p/>
        /// If <code>-thumb</code> is passed, then any thumbnail data will be written to a file with name of the
        /// input file having <code>.thumb.jpg</code> appended.
        /// <p/>
        /// If <code>-wiki</code> is passed, then output will be in a format suitable for Google Code's wiki.
        /// <p/>
        /// If <code>-hex</code> is passed, then the ID of each tag will be displayed in hexadecimal.
        /// </remarks>
        /// <param name="args">the command line arguments</param>
        /// <exception cref="Com.Drew.Metadata.MetadataException"/>
        /// <exception cref="System.IO.IOException"/>
        public static void Main(string[] args)
        {
            ICollection <string> argList = new AList <string>(Arrays.AsList(args));
            bool thumbRequested          = argList.Remove("-thumb");
            bool wikiFormat = argList.Remove("-wiki");
            bool showHex    = argList.Remove("-hex");

            if (argList.Count < 1)
            {
                string version = typeof(Com.Drew.Imaging.ImageMetadataReader).Assembly.GetImplementationVersion();
                System.Console.Out.Println("metadata-extractor version " + version);
                System.Console.Out.Println();
                System.Console.Out.Println(Sharpen.Extensions.StringFormat("Usage: java -jar metadata-extractor-%s.jar <filename> [<filename>] [-thumb] [-wiki] [-hex]", version == null ? "a.b.c" : version));
                System.Environment.Exit(1);
            }
            foreach (string filePath in argList)
            {
                long     startTime = Runtime.NanoTime();
                FilePath file      = new FilePath(filePath);
                if (!wikiFormat && argList.Count > 1)
                {
                    System.Console.Out.Printf("\n***** PROCESSING: %s\n%n", filePath);
                }
                Com.Drew.Metadata.Metadata metadata = null;
                try
                {
                    metadata = Com.Drew.Imaging.ImageMetadataReader.ReadMetadata(file);
                }
                catch (Exception e)
                {
                    Sharpen.Runtime.PrintStackTrace(e, System.Console.Error);
                    System.Environment.Exit(1);
                }
                long took = Runtime.NanoTime() - startTime;
                if (!wikiFormat)
                {
                    System.Console.Out.Printf("Processed %.3f MB file in %.2f ms%n%n", file.Length() / (1024d * 1024), took / 1000000d);
                }
                if (wikiFormat)
                {
                    string            fileName          = file.GetName();
                    string            urlName           = StringUtil.UrlEncode(fileName);
                    ExifIFD0Directory exifIFD0Directory = metadata.GetDirectory <ExifIFD0Directory>();
                    string            make  = exifIFD0Directory == null ? string.Empty : StringUtil.EscapeForWiki(exifIFD0Directory.GetString(ExifIFD0Directory.TagMake));
                    string            model = exifIFD0Directory == null ? string.Empty : StringUtil.EscapeForWiki(exifIFD0Directory.GetString(ExifIFD0Directory.TagModel));
                    System.Console.Out.Println();
                    System.Console.Out.Println("-----");
                    System.Console.Out.Println();
                    System.Console.Out.Printf("= %s - %s =%n", make, model);
                    System.Console.Out.Println();
                    System.Console.Out.Printf("<a href=\"http://sample-images.metadata-extractor.googlecode.com/git/%s\">%n", urlName);
                    System.Console.Out.Printf("<img src=\"http://sample-images.metadata-extractor.googlecode.com/git/%s\" width=\"300\"/><br/>%n", urlName);
                    System.Console.Out.Println(StringUtil.EscapeForWiki(fileName));
                    System.Console.Out.Println("</a>");
                    System.Console.Out.Println();
                    System.Console.Out.Println("|| *Directory* || *Tag Id* || *Tag Name* || *Extracted Value* ||");
                }
                // iterate over the metadata and print to System.out
                foreach (Com.Drew.Metadata.Directory directory in metadata.GetDirectories())
                {
                    string directoryName = directory.GetName();
                    foreach (Tag tag in directory.GetTags())
                    {
                        string tagName     = tag.GetTagName();
                        string description = tag.GetDescription();
                        // truncate the description if it's too long
                        if (description != null && description.Length > 1024)
                        {
                            description = Sharpen.Runtime.Substring(description, 0, 1024) + "...";
                        }
                        if (wikiFormat)
                        {
                            System.Console.Out.Printf("||%s||0x%s||%s||%s||%n", StringUtil.EscapeForWiki(directoryName), Sharpen.Extensions.ToHexString(tag.GetTagType()), StringUtil.EscapeForWiki(tagName), StringUtil.EscapeForWiki(description));
                        }
                        else
                        {
                            if (showHex)
                            {
                                System.Console.Out.Printf("[%s - %s] %s = %s%n", directoryName, tag.GetTagTypeHex(), tagName, description);
                            }
                            else
                            {
                                System.Console.Out.Printf("[%s] %s = %s%n", directoryName, tagName, description);
                            }
                        }
                    }
                    // print out any errors
                    foreach (string error in directory.GetErrors())
                    {
                        System.Console.Error.Println("ERROR: " + error);
                    }
                }
                if (args.Length > 1 && thumbRequested)
                {
                    ExifThumbnailDirectory directory_1 = metadata.GetDirectory <ExifThumbnailDirectory>();
                    if (directory_1 != null && directory_1.HasThumbnailData())
                    {
                        System.Console.Out.Println("Writing thumbnail...");
                        directory_1.WriteThumbnail(Sharpen.Extensions.Trim(args[0]) + ".thumb.jpg");
                    }
                    else
                    {
                        System.Console.Out.Println("No thumbnail data exists in this image");
                    }
                }
            }
        }