任务:阅读所有标签和评论中发现一个TIFF或EXIF文件没有加载的图像
任务:自动加载所有的标签和评论中发现一个TIFF或EXIF文件时,文件被加载
“元数据”是指额外的信息存储在一个图像,但没有必要解码图像。它可以包含信息所使用的摄像机图像,作者,照片拍摄的日期和时间,这张照片在哪里拍的,相机是否有GPS功能,等等。当一个图片被修改时,您应该保持原始信息,如果可能的话。元数据包括标记、标签和评论。这一主题将主要处理标记。有关标记和注释的更多信息,请参考以下:
JPEG文件包含元数据信息在用户定义的标记。用户定义的标记以0 xe0到0 xfe范围。这些标记可以有0 xfffd的最大大小,或65533字节。以下标记0 xe0保留图像的编码和插入标记可以保留文件无效。因此,你不应该使用保留标记除非你非常熟悉标记和图像编码在JPEG文件。
然而,TIFF文件不包含标记LEADTOOLS提供了一个“解决方案”将Exif评论从JPEG文件转移到TIFF文件,反之亦然。Exif TIFF文件元数据信息将作为APP1加载标记。因此,您可以加载Exif元数据从一个未压缩的文件并将它存储在一个压缩的Exif文件。你也可以从压缩的Exif文件元数据信息,并将其存储在一个未压缩的Exif文件。然而,请注意一些信息不能被存储在未压缩的Exif文件。例如,音频数据存储在APP2标记和没有对储蓄APP2标记在TIFF文件的内置支持。然而,你仍然可以自己保存音频数据,使用自定义标记。关于保存自定义标签的更多信息,请参考实现TIFF评论和标签。
图像元数据的定义RasterMarkerMetadata,RasterTagMetadata和RasterCommentMetadata类。这些类可以单独使用或在一个集合查询、阅读或写作图像元数据。的RasterImage类还包含RasterImage.Markers,RasterImage.Tags,RasterImage.Comments和RasterImage.GeoKeys将元数据存储在一个图像类集合。你可以查询、添加或删除该元数据或使用RasterCodecs直接从/对象自动读或写这些集合。
标记(而不是标记和注释)是通用的数据类型包含的所有文件标签、评论和geo密钥文件。一般来说,当工作在一个图像标记或注释,用户必须具有先验知识的元数据类型和预期的值。标记是有用的在处理图像元数据不需要任何以前的知识。
LEADTOOLS提供了几个方法来加载、创建、设置,修改,和释放的信息标记。
加载标记(或枚举可用标记)从现有的JPEG文件,电话RasterCodecs.ReadMarkers。结果集合包含所有的标记文件。虽然TIFF文件不支持标记,LEADTOOLS提供了有限的支持通过使用APP1 Exif标记。当你打电话RasterCodecs.ReadMarkersTIFF文件,创建一个APP1标记和所有的TIFF, GPS和Exif评论将存储在它。此外,任何其他标签ID大于0 x8000(32768)将存储在APP1标记。其他信息将被认为是有用的只有图像,不会加载到APP1标记。唯一的例外是分辨率信息,将加载APP1标记。
标记,标记和注释图像中可以直接设置,每一个图片都有RasterImage.Markers集合,允许您添加、删除、插入、清晰、获取和设置。所以,当一个文件被保存使用RasterCodecs.Save方法、标记、标签和/或评论的设置也会得救。
的RasterCodecs类包含广泛支持查询/负载/保存等标记文件标签、评论领域和地理键(附加标记在GeoTIFF文件中找到)。
以下部分列出了常见的任务执行在处理图像时标记以及LEADTOOLS类,属性和方法使用。
LEADTOOLS使用RasterImageFormat枚举来表示一个图像文件格式。你可以通过查询获得一个文件的格式CodecsImageInfo.Format属性返回RasterCodecs.GetInformation方法。当你使用任何的RasterCodecs.Load方法,将原始图像的图像格式存储的RasterImage.OriginalFormat财产。
一旦你有了一个RasterImageFormat,您可以通过以下RasterCodecs静态(共享VB)方法来确定这种格式支持所需的元数据类型:
方法 | 描述 |
---|---|
RasterCodecs.TagsSupported | 确定支持标签的格式。TIFF和EXIF是一些常见的文件格式,支持标签。 |
RasterCodecs.CommentsSupported | 确定的格式支持注释字段。TIFF, EXIF DICOM和ICA是一些常见的文件格式,支持注释字段。 |
RasterCodecs.GeoKeysSupported | 确定支持地理关键标签的格式。GeoTIFF是目前唯一的文件格式,支持地理标记的关键。 |
许多LEADTOOLS元数据查询、阅读和写作方法将抛出一个异常,如果文件格式不支持元数据。例如,试图调用RasterCodecs.ReadTag在一个几乎肯定会抛出一个BMP文件RasterExceptionCode.FeatureNotSupportred。消除需要捕捉和处理这些异常,加快您的代码,您可以使用上述任何一种方法和调用相应的查询,读或写元数据方法的格式是否支持它。
例如,下面的代码将读取描述注释字段从磁盘映像文件。如果文件支持评论,值将被读取和解析,否则,它将返回一个默认的信息:
私人静态字符串ReadDescriptionComment (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ /得到文件格式
使用(CodecsImageInfo信息= rasterCodecsInstance.GetInformation(文件名,假))
{
/ /检查是否这个文件格式支持注释字段
如果(RasterCodecs.CommentsSupported (info.Format))
{
/ /是的,阅读它
RasterCommentMetadata = rasterCodecsInstance置评。ReadComment(文件名1 RasterCommentMetadataType.Description);
返回comment.ToAscii ();
}
其他的
{
/ /不,返回一个默认的评论
返回“描述评论不支持”;
}
}
}
类似地,您可以使用RasterCodecs.TagsSupported和RasterCodecs.GeoKeysSupported确定格式支持分别标记和地理TIFF的钥匙。
根据EXIF格式规范,标签ID为0 x8298 (h8298) EXIF标记表示版权字符串。下面的代码将打印的版权标记值中发现一个EXIF文件:
私人静态无效ReadTagById (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有ReadTag将抛出一个异常
/ /支持标签。如果需要,使用RasterCodecs。TagsSupported第一
常量intexifCopyrightTagId = 0 x8298;
= rasterCodecsInstance RasterTagMetadata标签。ReadTag(文件名1 exifCopyrightTagId);
如果(标签! =零)
{
/ /找到标签,显示值
Console.WriteLine (tag.ToAscii ());
}
}
下面的代码将打印一个EXIF文件中的描述评论价值:
私人静态无效ReadCommentById (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有ReadComment将抛出一个异常
/ /支持评论。如果需要,使用RasterCodecs。CommentsSupported第一
RasterCommentMetadata = rasterCodecsInstance置评。ReadComment(文件名1 RasterCommentMetadataType.Description);
如果(评论! =零)
{
/ /评论,显示值
Console.WriteLine (comment.ToAscii ());
}
}
类似地,您可以使用RasterCodecs.ReadGeoKey读一个TIFF地理主要通过ID文件。
根据EXIF格式规范,标签ID为0 x8298 (h8298) EXIF标记表示版权字符串。下面的代码将更新版权标记文本的EXIF文件“版权(c)我公司”:
私人静态无效WriteTagById (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ /创建标签
常量intexifCopyrightTagId = 0 x8298;
RasterTagMetadata标签=新RasterTagMetadata (exifCopyrightTagId RasterTagMetadataDataType.Ascii,零);
tag.FromAscii (“我公司版权(c)”);
/ /写文件
rasterCodecsInstance。WriteTag(文件名,1、标签);
}
下面的代码将更新描述注释栏的EXIF文件描述“我”:
私人静态无效WriteCommentById (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ /创建评论
RasterCommentMetadata评论=新RasterCommentMetadata (RasterCommentMetadataType.Description零);
comment.FromAscii (“我的描述”);
/ /写文件
rasterCodecsInstance。WriteComment(文件名,1、评论);
}
类似地,您可以使用RasterCodecs.WriteGeoKey写一个TIFF地理主要通过ID文件。
使用下面的代码阅读所有的标签中发现一个TIFF或EXIF文件:
私人静态无效ReadAllTagsWithoutLoadingImage (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有ReadTags将抛出一个异常
/ /支持标签。如果需要,使用RasterCodecs。TagsSupported第一
= rasterCodecsInstance IList < RasterTagMetadata >标签。ReadTags(文件名,1);
foreach(RasterTagMetadata标签在标签)
{
/ /处理标签
System.Diagnostics.Trace.WriteLine (“标签发现,id = "+ tag.Id.ToString (“X”));
/ /标记数据可以获得tag.GetData()或各种.ToXXX方法
}
}
上面的代码读取所有标签以及他们的数据。列举所有的标签没有读取数据,您可以使用RasterCodecs.EnumTags方法。这是一个例子:
私人静态无效ReadAllTagsWithoutData (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有EnumTags将抛出一个异常
/ /支持标签。如果需要,使用RasterCodecs。TagsSupported第一
rasterCodecsInstance。TagFound + =新EventHandler < CodecsEnumTagsEventArgs > (rasterCodecsInstance_TagFound);
rasterCodecsInstance。EnumTags(文件名,1);
rasterCodecsInstance。TagFound - =新EventHandler < CodecsEnumTagsEventArgs > (rasterCodecsInstance_TagFound);
}
私人静态无效rasterCodecsInstance_TagFound (对象发送方,CodecsEnumTagsEventArgs e)
{
/ /显示标签ID
System.Diagnostics.Trace.WriteLine (“标签发现,id = "+ e.Id.ToString (“X”));
}
使用下面的代码阅读所有的评论字段中发现一个TIFF或EXIF文件:
私人静态无效ReadAllCommentsWithoutLoadingImage (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有ReadComments将抛出一个异常
/ /支持评论。如果需要,使用RasterCodecs。CommentsSupported第一
= rasterCodecsInstance IList < RasterCommentMetadata >评论。ReadComments(文件名,1);
foreach(RasterCommentMetadata评论在注释)
{
/ /流程的评论
System.Diagnostics.Trace.WriteLine (“评论发现,type = "+ comment.Type.ToString ());
}
}
类似地,您可以使用RasterCodecs.ReadGeoKeys和RasterCodecs.EnumGeoKeys阅读所有TIFF Geo钥匙的ID文件。
根据EXIF格式规范,标签ID为0 x8298 (&h8298) EXIF标记表示版权字符串和标签ID 0 x010e (&h010E)是EXIF标记表示图像标题。下面的代码将更新这些标签的EXIF文件在磁盘上“版权(c)我公司”和“我的图片”。
私人静态无效WriteTagsWithoutLoadingImage (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有WriteTags将抛出一个异常
/ /支持标签。如果需要,使用RasterCodecs。TagsSupported第一
/ /创建标签
常量intexifCopyrightTagId = 0 x8298;
常量intexifImageTitleTagId = 0 x010e;
IList = < RasterTagMetadata >标签新列表< RasterTagMetadata > ();
RasterTagMetadata标签=新RasterTagMetadata (exifCopyrightTagId RasterTagMetadataDataType.Ascii,零);
tag.FromAscii (“我公司版权(c)”);
tags.Add(标签);
标签=新RasterTagMetadata (exifImageTitleTagId RasterTagMetadataDataType.Ascii,零);
tag.FromAscii (“我的图片”);
tags.Add(标签);
/ /写文件
rasterCodecsInstance。WriteTags(文件名,1、标签);
}
使用下面的代码更新评论版权和描述字段的EXIF文件没有加载图片:
私人静态无效WriteCommentsWithoutLoadingImage (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / RasterCodecs。如果文件名没有WriteComments将抛出一个异常
/ /支持评论。如果需要,使用RasterCodecs。CommentsSupported第一
/ /创建注释
IList = < RasterCommentMetadata >评论新列表< RasterCommentMetadata > ();
RasterCommentMetadata评论=新RasterCommentMetadata (RasterCommentMetadataType.Copyright零);
comment.FromAscii (“我公司版权(c)”);
comments.Add(评论);
评论=新RasterCommentMetadata (RasterCommentMetadataType.Description零);
comment.FromAscii (“我的描述”);
comments.Add(评论);
/ /写文件
rasterCodecsInstance。WriteComments(文件名、1、注释);
}
类似地,您可以使用RasterCodecs.WriteGeoKeys更新TIFF Geo钥匙通过ID文件。
的RasterImage类包含一个RasterImage.Tags和RasterImage.Comments集合,可用于存储所有与图像相关的标记和注释。
注意:TIFF文件写标签,使用RasterCodecs.WriteTags而不是使用RasterImage.Tags紧随其后的是RasterCodecs.Save。
加载所有的标记和注释从磁盘文件到这个集合,你可以使用上面描述的代码来加载标记和注释手动然后将它们添加到图像标记和评论收集或使用CodecsLoadOptions.Tags和CodecsLoadOptions.Comments属性自动加载时所有的标签和/或评论图像加载。
使用这些属性保证没有将抛出异常,即使这些元数据格式不支持因为LEADTOOLS将内部电话RasterCodecs.TagsSupported和/或RasterCodecs.CommentsSupported且仅加载元数据格式是否支持他们。
下面的例子将光栅图像以及加载所有标记和注释字段中发现一个磁盘文件:
私人静态RasterImage LoadImageWithTags (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ /设置标记读取图像时加载
rasterCodecsInstance.Options.Load。标记=假;
rasterCodecsInstance.Options.Load。标签=真正的;
rasterCodecsInstance.Options.Load。评论=假;
rasterCodecsInstance.Options.Load。GeoKeys =假;
/ /加载和返回图像
= rasterCodecsInstance RasterImage形象。负载(文件名,0,CodecsLoadByteOrder。BgrOrGray 1 1);
/ /跟踪信息:
System.Diagnostics.Trace.WriteLine (”格式是:“+ image.OriginalFormat);
System.Diagnostics.Trace.WriteLine (“加载标签数量”+ image.Tags.Count);
返回形象;
}
类似地,您可以使用CodecsLoadOptions.GeoKeys和RasterImage.GeoKeys阅读所有TIFF地理主要通过ID文件。
除了CodecsLoadOptions.Tags和CodecsLoadOptions.Comments在前一节中所讨论的,您还可以使用CodecsSaveOptions.Tags和CodecsSaveOptions.Comments保存这些元数据的属性保存文件时图像。
通过使用CodecsLoadOptions.Tags,CodecsLoadOptions.Comments,CodecsSaveOptions.Tags和CodecsSaveOptions.Comments,您可以执行以下任务的任意组合:
下面的例子将会加载一个EXIF图像,添加水印图像表面,并添加这个词“LEADTOOLS”形象EXIF评论标题标签和描述字段。其他图像标记和注释将被保存的新形象:
私人静态无效LoadUpdateSaveImageMetadata (RasterCodecs rasterCodecsInstance,字符串文件名)
{
/ / 1。设置标记读取图像时加载
rasterCodecsInstance.Options.Load。标记=假;
rasterCodecsInstance.Options.Load。标签=真正的;
rasterCodecsInstance.Options.Load。评论=真正的;
rasterCodecsInstance.Options.Load。GeoKeys =假;
/ / 2。加载图片
使用(= rasterCodecsInstance RasterImage形象。负载(文件名,0,CodecsLoadByteOrder。BgrOrGray 1,1))
{
/ / 3。添加字符串“LEADTOOLS”形象
/ /注意:如果你不需要将字符串添加到图像,然后
/ /跳到4。更新te元数据
IntPtr hdc = image.CreateLeadDC ();
使用(图形g = Graphics.FromHdc (hdc))
使用(字体f =新字体(FontFamily。40岁的GenericSansSerif FontStyle.Bold))
使用(刷b =新SolidBrush(颜色。Color.Black FromArgb (128)))
{
g.DrawString (“LEADTOOLS”f b, 0, 0);
}
RasterImage.DeleteLeadDC (hdc);
/ / 4。更新元数据
/ /因为我们设置CodecsLoadOptions。标签和CodecsLoadOptions.Comments
/ /为true, RasterCodecs对象会阅读所有标签和评论
/ /文件并将它们存储在RasterImage。标签和RasterImage.Comments
/ /分别集合。
/ /找到EXIF标题标签
常量intexifImageTitleTagId = 0 x010e;
RasterTagMetadata imageTitleTag =零;
foreach(RasterTagMetadata标签在image.Tags)
{
如果(标签。Id = = exifImageTitleTagId)
{
imageTitleTag =标记;
打破;
}
}
/ /如果发现标签,更新它
如果(imageTitleTag ! =零)
{
字符串title = imageTitleTag.ToAscii ();
title =“LEADTOOLS——”+标题;
imageTitleTag.FromAscii(标题);
}
/ /找到注解字段描述
RasterCommentMetadata descriptionComment =零;
foreach(RasterCommentMetadata评论在image.Comments)
{
如果(评论。类型= = RasterCommentMetadataType.Description)
{
descriptionComment =评论;
打破;
}
}
/ /如果发现评论,更新它
如果(descriptionComment ! =零)
{
字符串title = descriptionComment.ToAscii ();
title =“LEADTOOLS——”+标题;
descriptionComment.FromAscii(标题);
}
/ /更新现有的元数据,您可以
/ /添加和删除尽可能多的标记和注释
/ /在这里集合
/ / 5。设置时写的标记图像保存
rasterCodecsInstance.Options.Save。标记=假;
rasterCodecsInstance.Options.Save。标签=真正的;
rasterCodecsInstance.Options.Save。评论=真正的;
rasterCodecsInstance.Options.Save。GeoKeys =假;
/ /保存它
/ /因为我们设置CodecsSaveOptions。标签和CodecsSaveOptions.Comments
/ /为true, RasterCodecs对象会写的所有标记和注释
/ / RasterImage。标签和RasterImage.Commentscollections respectively and
/ /保存到文件
rasterCodecsInstance。保存(形象、文件名、形象。OriginalFormat, 0);
}
}
类似地,您可以使用CodecsLoadOptions.GeoKeys和CodecsSaveOptions.GeoKeys自动读/写所有关键TIFF地理从/到一个文件中。
最快的方法来删除一个标签与一个已知的文件是通过使用IDRasterCodecs.DeleteTag方法。这种方法的优点是直接从磁盘文件删除标签而不需要加载和解析图像数据。
使用的邮票是一种特殊的元数据只EXIF, CMP,就是以前和FlashPix格式存储图像的缩略图。读或写邮票,使用RasterCodecs.ReadStamp和RasterCodecs.SaveStamp。