如何在.Net中修改tiff创建日期

时间:2014-05-31 02:20:59

标签: c# .net image-manipulation tiff

我正在写pdf comparison utility。在some investigation之后,似乎最好的方法是转换为tiff并从那里进行比较。

我设法使用Ghostscript执行此操作,但我在嵌入式创建日期元数据方面有所不同。

different creation dates embedded in tiff

如何使用.Net来修改它?

4 个答案:

答案 0 :(得分:1)

经过更多调查,似乎微软确实提供了一个支持多图像的TIFF库。它在System.Windows.Media.Imaging中。获取此命名空间参考PresentationCore。

要访问TIFF元数据,请使用此网站作为参考:http://www.awaresystems.be/imaging/tiff/tifftags/baseline.html

此代码访问您感兴趣的GhostScript名称后的日期字段:

    FileInfo fi = new FileInfo(@"C:\Users\Chris\Downloads\PdfVerificationTests.can_use_image_approval_mode.approved.tiff");
    FileStream stream = fi.Open(FileMode.Open, FileAccess.ReadWrite,FileShare.None);
    TiffBitmapDecoder decoder = new TiffBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    BitmapMetadata bmd = (BitmapMetadata) decoder.Frames[0].Metadata;
    string thedateval = (string) bmd.GetQuery("/ifd/{ushort=306}");
    BitmapMetadata bmd2 = bmd.Clone();
    bmd2.SetQuery("/ifd/{ushort=306}", "2013:05:30 20:07:52");

此代码写出修改过的TIFF,但这是您需要执行的所有信息。希望这会有所帮助,因为我觉得我打败了一匹死马。

此代码将从多页TIFF中删除所有属性,并保持图像内容不变:

    FileInfo fi = new FileInfo(@"C:\Users\Chris\Downloads\PdfVerificationTests.can_use_image_approval_mode.approved.tiff");
    FileStream stream = fi.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    TiffBitmapDecoder decoder = new TiffBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None);
    FileStream stream2 = new FileStream("empty.tif", FileMode.Create);
    TiffBitmapEncoder encoder = new TiffBitmapEncoder();
    for (int i = 0; i < decoder.Frames.Count(); i++)
    {
        BitmapSource source = decoder.Frames[i];
        int stride = source.PixelWidth * (source.Format.BitsPerPixel / 8);
        byte[] data = new byte[stride * source.PixelHeight];
        source.CopyPixels(data, stride, 0);
        CachedBitmap theSource = (CachedBitmap)BitmapSource.Create(source.PixelWidth, source.PixelHeight, source.DpiX, source.DpiY, source.Format, source.Palette, data, stride);
        encoder.Frames.Add(BitmapFrame.Create(theSource));
    }
    try
    {
        encoder.Save(stream2);
        stream2.Close();
        stream.Close();
    }
    catch
    {
    }

答案 1 :(得分:1)

您可以使用LibTiff.NET。它是开源的。使用此库,您可以使用SetField method修改Tiff文件中的许多tags中的任何一个,包括TiffTag.DATETIME标记。

答案 2 :(得分:0)

如果日期戳是固定大小的,针对此类问题的一个有趣的解决方法是编写一个FileStream,它只是检测并清空这些日期戳。事实上,我之前已经完成了这项工作,以便进行PDF比较,这是我在学校工作的一个项目。校验和比较恰到好处,没有任何转换为​​tiff,但在我们的特定情况下,我们确信所有比较的PDF都是由同一系统生成的,所以简化了一些事情。

基本方法是使用重写的FileStreamReadByte函数创建Read的子类,其中包含日期戳的长度和预期格式。每当执行读取时,都会发生以下情况:

  • 代码在请求的数据之前和之后读取一个额外的部分,日期戳长度减去1个字节。
  • 在该区块内,执行搜索和替换以清除所有找到的日期戳。
  • 最后,返回原始请求的作品。

我在当天为该项目编写的源代码是here

答案 3 :(得分:0)

似乎可以抑制这种ghostscript行为。

  

-dTIFFDateTime = false

https://www.ghostscript.com/doc/9.22/Devices.htm

...但是对于这种情况,我会推荐一些diffpdf工具(http://soft.rubypdf.com/software/diffpdf

D