/// <summary>Reads metadata from an <see cref="Stream"/>.</summary>
        /// <param name="stream">A stream from which the file data may be read.  The stream must be positioned at the beginning of the file's data.</param>
        /// <returns>A list of <see cref="Directory"/> instances containing the various types of metadata found within the file's data.</returns>
        /// <exception cref="ImageProcessingException">The file type is unknown, or processing errors occurred.</exception>
        /// <exception cref="System.IO.IOException"/>
        public static DirectoryList ReadMetadata(Stream stream)
        {
            var fileType = FileTypeDetector.DetectFileType(stream);

            var directories = new List <Directory>();

            directories.AddRange(fileType switch
            {
                FileType.Arw => TiffMetadataReader.ReadMetadata(stream),
                FileType.Avi => AviMetadataReader.ReadMetadata(stream),
                FileType.Bmp => BmpMetadataReader.ReadMetadata(stream),
                FileType.Crx => QuickTimeMetadataReader.ReadMetadata(stream),
                FileType.Cr2 => TiffMetadataReader.ReadMetadata(stream),
                FileType.Eps => EpsMetadataReader.ReadMetadata(stream),
                FileType.Gif => GifMetadataReader.ReadMetadata(stream),
                FileType.Ico => IcoMetadataReader.ReadMetadata(stream),
                FileType.Jpeg => JpegMetadataReader.ReadMetadata(stream),
                FileType.Mp3 => Mp3MetadataReader.ReadMetadata(stream),
                FileType.Nef => TiffMetadataReader.ReadMetadata(stream),
                FileType.Netpbm => new Directory[] { NetpbmMetadataReader.ReadMetadata(stream) },
                FileType.Orf => TiffMetadataReader.ReadMetadata(stream),
                FileType.Pcx => new Directory[] { PcxMetadataReader.ReadMetadata(stream) },
                FileType.Png => PngMetadataReader.ReadMetadata(stream),
                FileType.Psd => PsdMetadataReader.ReadMetadata(stream),
                FileType.QuickTime => QuickTimeMetadataReader.ReadMetadata(stream),
                FileType.Raf => RafMetadataReader.ReadMetadata(stream),
                FileType.Rw2 => TiffMetadataReader.ReadMetadata(stream),
                FileType.Tga => TgaMetadataReader.ReadMetadata(stream),
                FileType.Tiff => TiffMetadataReader.ReadMetadata(stream),
                FileType.Wav => WavMetadataReader.ReadMetadata(stream),
                FileType.WebP => WebPMetadataReader.ReadMetadata(stream),

                FileType.Unknown => throw new ImageProcessingException("File format could not be determined"),
                _ => Enumerable.Empty <Directory>()
            });
示例#2
0
        public static IEnumerable <MetadataExtractor.Directory> GetFileMetaData(string fullpath)
        {
            var type = GetType(fullpath);
            IEnumerable <MetadataExtractor.Directory> data = type switch
            {
                FileTypeEnum.JPG => JpegMetadataReader.ReadMetadata(fullpath),
                FileTypeEnum.CR2 => TiffMetadataReader.ReadMetadata(fullpath),
                FileTypeEnum.PNG => PngMetadataReader.ReadMetadata(fullpath),
                _ => throw new Exception(),// is unreachable
            };

            return(data.ToList());
        }
示例#3
0
        ReadMetadata([NotNull] Stream stream)
        {
            var fileType = FileTypeDetector.DetectFileType(stream);

            switch (fileType)
            {
            case FileType.Jpeg:
                return(JpegMetadataReader.ReadMetadata(stream));

            case FileType.Tiff:
            case FileType.Arw:
            case FileType.Cr2:
            case FileType.Nef:
            case FileType.Orf:
            case FileType.Rw2:
                return(TiffMetadataReader.ReadMetadata(stream));

            case FileType.Psd:
                return(PsdMetadataReader.ReadMetadata(stream));

            case FileType.Png:
                return(PngMetadataReader.ReadMetadata(stream));

            case FileType.Bmp:
                return(new Directory[] { BmpMetadataReader.ReadMetadata(stream) });

            case FileType.Gif:
                return(GifMetadataReader.ReadMetadata(stream));

            case FileType.Ico:
                return(IcoMetadataReader.ReadMetadata(stream));

            case FileType.Pcx:
                return(new Directory[] { PcxMetadataReader.ReadMetadata(stream) });

            case FileType.Riff:
                return(WebPMetadataReader.ReadMetadata(stream));

            case FileType.Raf:
                return(RafMetadataReader.ReadMetadata(stream));

            case FileType.QuickTime:
                return(QuickTimeMetadataReader.ReadMetadata(stream));

            case FileType.Netpbm:
                return(new Directory[] { NetpbmMetadataReader.ReadMetadata(stream) });
            }

            throw new ImageProcessingException("File format is not supported");
        }
        public static Com.Drew.Metadata.Metadata ReadMetadata([NotNull] InputStream inputStream)
        {
            BufferedInputStream bufferedInputStream = inputStream is BufferedInputStream ? (BufferedInputStream)inputStream : new BufferedInputStream(inputStream);
            FileType            fileType            = FileTypeDetector.DetectFileType(bufferedInputStream) ?? FileType.Unknown;

            if (fileType == FileType.Jpeg)
            {
                return(JpegMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Tiff || fileType == FileType.Arw || fileType == FileType.Cr2 || fileType == FileType.Nef || fileType == FileType.Orf || fileType == FileType.Rw2)
            {
                return(TiffMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Psd)
            {
                return(PsdMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Png)
            {
                return(PngMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Bmp)
            {
                return(BmpMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Gif)
            {
                return(GifMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Ico)
            {
                return(IcoMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Pcx)
            {
                return(PcxMetadataReader.ReadMetadata(bufferedInputStream));
            }
            if (fileType == FileType.Riff)
            {
                return(WebpMetadataReader.ReadMetadata(bufferedInputStream));
            }
            throw new ImageProcessingException("File format is not supported");
        }
        public static Com.Drew.Metadata.Metadata ReadMetadata(InputStream inputStream)
        {
            InputStream bufferedInputStream = inputStream is BufferedInputStream ? inputStream : new BufferedInputStream(inputStream);
            int         magicNumber         = PeekMagicNumber(bufferedInputStream);

            if (magicNumber == -1)
            {
                throw new ImageProcessingException("Could not determine file's magic number.");
            }
            // This covers all JPEG files
            if ((magicNumber & JpegFileMagicNumber) == JpegFileMagicNumber)
            {
                return(JpegMetadataReader.ReadMetadata(bufferedInputStream));
            }
            // This covers all TIFF and camera RAW files
            if (magicNumber == IntelTiffMagicNumber || magicNumber == MotorolaTiffMagicNumber)
            {
                return(TiffMetadataReader.ReadMetadata(bufferedInputStream));
            }
            // This covers PSD files
            // TODO we should really check all 4 bytes of the PSD magic number
            if (magicNumber == PsdMagicNumber)
            {
                return(PsdMetadataReader.ReadMetadata(bufferedInputStream));
            }
            // This covers BMP files
            if (magicNumber == PngMagicNumber)
            {
                return(PngMetadataReader.ReadMetadata(bufferedInputStream));
            }
            // This covers BMP files
            if (magicNumber == BmpMagicNumber)
            {
                return(BmpMetadataReader.ReadMetadata(bufferedInputStream));
            }
            // This covers GIF files
            if (magicNumber == GifMagicNumber)
            {
                return(GifMetadataReader.ReadMetadata(bufferedInputStream));
            }
            throw new ImageProcessingException("File format is not supported");
        }
示例#6
0
        /// <summary>Reads metadata from an <see cref="Stream"/>.</summary>
        /// <param name="stream">A stream from which the file data may be read.  The stream must be positioned at the beginning of the file's data.</param>
        /// <returns>A list of <see cref="Directory"/> instances containing the various types of metadata found within the file's data.</returns>
        /// <exception cref="ImageProcessingException">The file type is unknown, or processing errors occurred.</exception>
        /// <exception cref="System.IO.IOException"/>
        public static DirectoryList ReadMetadata(Stream stream)
        {
            var fileType = FileTypeDetector.DetectFileType(stream);

            var fileTypeDirectory = new FileTypeDirectory(fileType);

            switch (fileType)
            {
            case FileType.Jpeg:
                return(Append(JpegMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Tiff:
            case FileType.Arw:
            case FileType.Cr2:
            case FileType.Nef:
            case FileType.Orf:
            case FileType.Rw2:
                return(Append(TiffMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Psd:
                return(Append(PsdMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Png:
                return(Append(PngMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Bmp:
                return(Append(BmpMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Gif:
                return(Append(GifMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Ico:
                return(Append(IcoMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Pcx:
                return(new Directory[] { PcxMetadataReader.ReadMetadata(stream), fileTypeDirectory });

            case FileType.WebP:
                return(Append(WebPMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Avi:
                return(Append(AviMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Wav:
                return(Append(WavMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Raf:
                return(Append(RafMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.QuickTime:
            case FileType.Crx:
                return(Append(QuickTimeMetadataReader.ReadMetadata(stream), fileTypeDirectory));

            case FileType.Netpbm:
                return(new Directory[] { NetpbmMetadataReader.ReadMetadata(stream), fileTypeDirectory });

            case FileType.Unknown:
                throw new ImageProcessingException("File format could not be determined");

            case FileType.Riff:
            case FileType.Crw:
            default:
                throw new ImageProcessingException("File format is not supported");
            }
示例#7
0
        public static void Main(string[] someArgs)
        {
            if (someArgs.Length == 0)
            {
                Console.Error.WriteLine("Use: MetaDataExtractor [FilePaths|DirectoryPaths] [noUnknown|asXml|asXml2|doSub]");
                Console.Error.WriteLine("     - noUnknown: will hide unknown metadata tag");
                Console.Error.WriteLine("     - asXml    : will generate an XML stream");
                Console.Error.WriteLine("     - asXml2   : will generate an XML stream with more information than asXml");
                Console.Error.WriteLine("     - doSub    : will search subdirectories for *.jpg, *.raw, *.cr2, *.crw");
                Console.Error.WriteLine("Examples:");
                Console.Error.WriteLine("     - Will show you MyImage.jpg info as text:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\MyImage.jpg");
                Console.Error.WriteLine(" or ");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ and img1.jpg and img2.jpg info as text:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ d:\\img1.jpg e:\\img2.jpg");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ as text but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ noUnknown");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ as XML:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ asXml");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\ as XML2 but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\ noUnknown asXml2");
                Console.Error.WriteLine("     - Will show you all *.jpg|*.raw|*.cr2|*.crw in c:\\Temp\\ and all its subdirectories as XML but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\Temp noUnknown asXml doSub");
                Console.Error.WriteLine("     - Will put in a file called sample.xml all c:\\Temp\\ *.jpg|*.raw|*.cr2|*.crw and all its subdirectories as XML but with no unkown tags:");
                Console.Error.WriteLine("       MetaDataExtractor c:\\Temp noUnknown asXml doSub > sample.xml");
                Console.Error.WriteLine("Cautions:");
                Console.Error.WriteLine(" + Pointing on c:\\ with doSub option is a very bad idea ;-)");
            }
            else
            {
                Run.FindAsXml(someArgs);
                Run.FindNoUnknown(someArgs);
                Run.FindDoSub(someArgs);

                StringBuilder lcGlobalBuff = new StringBuilder(1024);

                IOutPutTextStreamHandler lcXmlHandler = null;

                string dtdFile = null;
                if (Run.asXml == (byte)1)
                {
                    lcXmlHandler = new XmlOutPutStreamHandler();
                    dtdFile      = "MetadataExtractor.dtd";
                }
                else if (Run.asXml == (byte)2)
                {
                    lcXmlHandler = new XmlNewOutPutStreamHandler();
                    dtdFile      = "MetadataExtractorNew.dtd";
                }
                else
                {
                    lcXmlHandler = new TxtOutPutStreamHandler();
                }
                lcXmlHandler.DoUnknown = !Run.noUnknown;

                List <string> lcFileNameLst = Run.FindFileNames(someArgs);
                // Args for OutPutTextStream objects

                // Indicate your Xsl here
                string lcXslFileName = null; // For example: ="exif.xslt";
                // Indicate if you want to use CDDATA in your XML stream
                string   useCDDATA      = "false";
                string[] lcOutputParams = new string[] { "ISO-8859-1", lcXslFileName, lcFileNameLst.Count.ToString(), dtdFile, useCDDATA };

                lcXmlHandler.StartTextStream(lcGlobalBuff, lcOutputParams);
                foreach (string lcFileName in lcFileNameLst)
                {
                    StringBuilder lcBuff     = new StringBuilder(2048);
                    Metadata      lcMetadata = null;
                    try
                    {
                        FileInfo lcImgFileInfo = new FileInfo(lcFileName);
                        if (lcFileName.ToLower().EndsWith(".raw") ||
                            lcFileName.ToLower().EndsWith(".cr2") ||
                            lcFileName.ToLower().EndsWith(".crw"))
                        {
                            lcMetadata = TiffMetadataReader.ReadMetadata(lcImgFileInfo);
                        }
                        else
                        {
                            lcMetadata = JpegMetadataReader.ReadMetadata(lcImgFileInfo);
                        }
                        lcXmlHandler.Metadata = lcMetadata;
                    }
                    catch (JpegProcessingException e)
                    {
                        Console.Error.WriteLine("Could note analyse the file '" + lcFileName + "' error message is:" + e.Message);
                        break;
                    }

                    if (Run.asXml != (byte)0)
                    {
                        // First open file name tag
                        lcBuff.Append("<file name=\"");
                        lcXmlHandler.Normalize(lcBuff, lcFileName, false);
                        lcBuff.Append("\">").AppendLine();
                        // Then create all directory tag
                        lcBuff.Append(lcXmlHandler.AsText());
                        // Then close file tag
                        lcBuff.Append("</file>").AppendLine().AppendLine();
                    }
                    else
                    {
                        lcBuff.Append("-> ");
                        lcXmlHandler.Normalize(lcBuff, lcFileName, false);
                        lcBuff.Append(" <-").AppendLine();
                        // Then create all directory tag
                        lcBuff.Append(lcXmlHandler.AsText()).AppendLine();
                    }
                    lcMetadata = null;
                    // Adds result for this file to big buffer
                    lcGlobalBuff.Append(lcBuff);
                    lcGlobalBuff.AppendLine();
                }
                lcXmlHandler.EndTextStream(lcGlobalBuff, lcOutputParams);

                Console.Out.WriteLine(lcGlobalBuff.ToString());
            }

            // Uncomment if you are running under VisualStudio
            // Console.In.ReadLine();
        }
示例#8
0
        /// <summary>
        /// メタデータの構造データを取得する
        /// </summary>
        /// <param name="filePath">ファイルパス</param>
        /// <param name="fileExtensionType">ファイルの拡張子</param>
        /// <returns>メタデータの構造データ</returns>
        private static IEnumerable <Directory> GetMetadataDirectories(string filePath, FileExtensionType fileExtensionType)
        {
            var directories = fileExtensionType switch
            {
                FileExtensionType.Jpeg => JpegMetadataReader.ReadMetadata(filePath),
                FileExtensionType.Bmp => BmpMetadataReader.ReadMetadata(filePath),
                FileExtensionType.Png => PngMetadataReader.ReadMetadata(filePath),
                FileExtensionType.Gif => GifMetadataReader.ReadMetadata(filePath),
                FileExtensionType.Tiff or FileExtensionType.Dng or FileExtensionType.Nef => TiffMetadataReader.ReadMetadata(filePath),
                FileExtensionType.Unknown or _ => throw new ArgumentOutOfRangeException(nameof(fileExtensionType)),
            };

            return(directories);
        }
示例#9
0
 public override void analyzeFile()
 {
     com.drew.metadata.Metadata m;
     try
     {
         if (strExt.ToLower() == ".raw" ||
             strExt.ToLower() == ".cr2" ||
             strExt.ToLower() == ".crw")
         {
             m = TiffMetadataReader.ReadMetadata(stm);
         }
         else
         {
             m = JpegMetadataReader.ReadMetadata(stm);
         }
         IEnumerator <AbstractDirectory> lcDirectoryEnum = m.GetDirectoryIterator();
         while (lcDirectoryEnum.MoveNext())
         {
             if (lcDirectoryEnum.Current.GetName() != "Jpeg Makernote")
             {
                 SerializableDictionary <string, string> dicTags = new SerializableDictionary <string, string>();
                 AbstractDirectory lcDirectory = lcDirectoryEnum.Current;
                 IEnumerator <Tag> lcTagsEnum  = lcDirectory.GetTagIterator();
                 while (lcTagsEnum.MoveNext())
                 {
                     Tag tag = lcTagsEnum.Current;
                     if (tag.GetTagName() == "Thumbnail Data")
                     {
                         Thumbnail = (byte[])tag.GetTagValue();
                     }
                     string lcDescription = "";
                     try
                     {
                         lcDescription = tag.GetDescription();
                     }
                     catch { };
                     string lcName = tag.GetTagName();
                     if (lcName.ToLower().StartsWith("unknown") || lcDescription.ToLower().StartsWith("unknown"))
                     {
                         continue;
                     }
                     lcName        = Functions.RemoveAccentsWithNormalization(lcName);
                     lcDescription = Functions.RemoveAccentsWithNormalization(lcDescription);
                     if (lcName.ToLower() == "owner name" || lcName.ToLower() == "copyright")
                     {
                         if (!string.IsNullOrEmpty(lcDescription) && lcDescription.Trim() != string.Empty &&
                             !lcDescription.ToLower().Contains("digital") && !lcDescription.ToLower().Contains("camera") && !lcDescription.ToLower().Contains("(c)") &&
                             !lcDescription.ToLower().Contains("copyright"))
                         {
                             FoundUsers.AddUniqueItem(lcDescription, false, "Copyright/Owner name");
                         }
                     }
                     if (lcName.ToLower() == "software")
                     {
                         string strSoftware = Analysis.ApplicationAnalysis.GetApplicationsFromString(lcDescription.Trim());
                         if (!FoundMetaData.Applications.Items.Any(A => A.Name == strSoftware))
                         {
                             FoundMetaData.Applications.Items.Add(new ApplicationsItem(strSoftware));
                         }
                     }
                     if (lcName.ToLower() == "model")
                     {
                         FoundMetaData.Model = lcDescription.Trim();
                     }
                     dicTags.Add(lcName, lcDescription);
                 }
                 dicAnotherMetadata.Add(lcDirectory.GetName(), dicTags);
             }
         }
     }
     catch (Exception e)
     {
         System.Diagnostics.Debug.WriteLine($"Error analizing EXIF metadata ({e.ToString()})");
     }
     finally
     {
         this.stm.Close();
     }
 }