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

C# 如何在.Net中修改tiff创建日期,c#,.net,image-manipulation,tiff,C#,.net,Image Manipulation,Tiff,我正在写一封信。之后,似乎最好的方法是转换为tiff并从那里进行比较 我设法用Ghostscript实现了这一点,但嵌入的创建日期元数据有所不同 如何使用.Net修改此文件?经过进一步调查,Microsoft似乎确实提供了支持多图像的TIFF库。它位于System.Windows.Media.Imaging中。获取此命名空间引用PresentationCore 要访问TIFF元数据,请使用此网站作为参考: 此代码访问您感兴趣的GhostScript名称后的日期字段: FileInfo

我正在写一封信。之后,似乎最好的方法是转换为tiff并从那里进行比较

我设法用Ghostscript实现了这一点,但嵌入的创建日期元数据有所不同


如何使用.Net修改此文件?

经过进一步调查,Microsoft似乎确实提供了支持多图像的TIFF库。它位于System.Windows.Media.Imaging中。获取此命名空间引用PresentationCore

要访问TIFF元数据,请使用此网站作为参考:

此代码访问您感兴趣的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
    {
    }
FileInfo-fi=newfileinfo(@“C:\Users\Chris\Downloads\PdfVerificationTests.can_-use_-image_-approval_-mode.approved.tiff”);
FileStream stream=fi.Open(FileMode.Open、FileAccess.ReadWrite、FileShare.None);
TiffBitmapDecoder=新的TiffBitmapDecoder(流,BitmapCreateOptions.None,BitmapCacheOption.None);
FileStream stream2=新文件流(“empty.tif”,FileMode.Create);
TiffBitmapEncoder编码器=新的TiffBitmapEncoder();
对于(int i=0;i
您可以使用。它是开源的。使用此库,您可以使用来修改Tiff文件中的任意一个,包括TiffTag.DATETIME标志。

如果日期戳的大小固定,则解决此类问题的一个有趣的方法是编写一个
文件流
,它只检测并清除此类日期戳。事实上,我以前在学校的一个项目上做过PDF比较。校验和比较在这方面工作得很好,没有任何到tiff的转换,尽管在我们的具体案例中,我们确信所有比较的PDF都是由同一个系统生成的,因此简化了一些事情

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

  • 代码在请求的数据之前和之后读取一个额外的片段,即日期戳长度的大小减去1字节
  • 在该块中,执行搜索和替换以清除任何找到的日期戳
  • 最后,返回原始请求的工件

我当年为该项目编写的源代码是。

它表明这种鬼脚本行为可以被抑制

-dTIFFDateTime=false

。。。但对于这种情况,我建议使用一些diffpdf工具()


D

创建日期与文件顶部是否有固定偏移?如果是这样,我会用另一个的值覆盖其中一个。@wilsotc我不知道,我希望得到一个库或BCL类的建议,该库或BCL类实际上对tiff文件结构有一些了解,而不是用字符串处理强制执行。您试过了吗:?@wilsotc我试过BitmapMetadata类。有趣的是,不是日期,请把TIFF放在我可以下载的地方。我可能有个解决办法。这也是个好办法。唯一的缺点是向项目中添加另一个库。@wilsotc——也许他可以看看源代码,看看他们是如何做到的?是的。你知道如何实际使用设置域吗?代码
使用(var tiff=tiff.Open(destination.FullName,“w”))tiff.SetField(TiffTag.DATETIME,“2010:01:01 12:00”)毫无希望地损坏了我的Tiff文件。事实上,使用模式的
“rw”
打开文件进行写入似乎可以解决损坏问题,但日期时间字段仍然没有设置好,因此进一步实验后,“rw”与“r”完全相同。我尝试过使用“a”,但输出仍然没有改变。您可以发布一段代码片段吗?对于子孙后代,正如我们在另一个地方讨论的那样:这种方法的问题是它扼杀了TIFF的许多优势(例如多页支持)。回到tiff,可能仍然有一个创建日期,只是一个新的日期。