/// <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>() });
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()); }
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"); }
/// <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"); }
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(); }
/// <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); }
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(); } }