【问题标题】:How can I delete tiff tags using the LibTiff.Net 2.3 library如何使用 LibTiff.Net 2.3 库删除 tiff 标签
【发布时间】:2012-02-24 02:15:22
【问题描述】:

我似乎找不到任何关于如何使用 LibTiff.Net 库删除 tiff 标签的文档。我喜欢图书馆,但这一种方法对我需要做的事情很重要。有一次我希望我可以设置一个标签并将它的价值设置为空。我曾希望这会奏效,但这是负面的。

有人知道如何使用 LibTiff.Net 库删除 tiff 标签吗?

【问题讨论】:

    标签: c# tags tiff libtiff.net


    【解决方案1】:

    请查看 LibTiff.Net 附带的 TiffCP 实用程序(尤其是其源代码)。

    LibTiff.Net 不提供删除标签的方法(LibTiff 也是如此)。您需要实现 TiffCP 功能的部分才能实现。

    基本上,您需要复制所有希望保留的标签,并复制像素数据无需解码和重新编码

    还请查看Convert a multi-strip TIFF image to a single-strip one 示例。它展示了如何复制标签并将原始(未解码的数据)从一张图像复制到另一张图像。该示例实际上在某些情况下会解码数据,因为它需要更改条带的数量,但您不需要解码数据。

    【讨论】:

    • 哇!这看起来正是我所追求的。我宁愿处理暴露的方法,然后深入研究私有的方法。非常感谢您指出 Bobrovsky !而且我也刚刚获得了“投票”特权......猜猜我将在哪里使用我的第一票? ;)
    【解决方案2】:

    我认为您基本上必须将输入文件复制到新的 TIFF 图像中,过滤掉您在此过程中不需要的标签。查看 tiffcp 实用程序,它是常规 libtiff 发行版的一部分。差不多就是这样,减去过滤。

    免责声明:我从未使用过 LibTiff.Net,并假设它与 LibTiff 非常相似。

    看看 tiffcp.c

    首先它手动复制/设置一些已知的标签,例如分辨率、压缩、颜色等。 然后它会复制所有可以在不进行预处理的情况下复制的标签集:

    for (p = tags; p < &tags[NTAGS]; p++)
        CopyTag(p->tag, p->count, p->type);
    

    然后它会复制实际的像素数据。根据我的回忆,这将删除 tiffcp 不知道的任何标签。如果您要删除的标签在列表中,您可以通过将其从该列表中删除来轻松删除它。

    【讨论】:

    • “过滤”部分是关键。我不确定我会怎么做。查看了 tiffcp.exe,它似乎只是用不同类型的压缩等简单地复制了 tiff。
    • 您应该查看源代码,而不是 exe?我已经用一些细节更新了上面的答案。
    • 谢谢 MK,我现在正在研究 c# 代码。找到与您在 c 中发布的区域相似的区域。是时候深入研究它了。 ;)
    【解决方案3】:

    注意:首先,这可能看起来像是一个很大的答案,但我想确保查看此问题的人看到所有“我创建的专有类,以保持所有内容都装箱以保持清洁。为了保持答案尽可能排序并提供信息,我将只粘贴 DeleteTiffTags 方法的代码。其余代码可以通过here 下载。

    现在来说好东西...我最终花了大约一天的时间来实现这一点,这要归功于伟大的 stackoverflow 社区回答了各种问题。我在我的一个类中编写了两个小(非常详细)方法来删除 tiff 标签。第一个是删除给定标签的列表,第二个是删除单个标签,该标签适用于上述方法。同样在这个例子中,我添加了几行来支持我的自定义 tiff 标签...它们都将在前面加上 //ADDED 注释。

    类:

    公共静态类 TIFFTAGS - 这个类是主类,通过执行 TIFFTAGS.DeleteTiffTags() 之类的操作简单地调用;因为它是一个静态类 无需创建它的对象即可使用它的方法。

    私人课程 TIFFTAGS_PAGE - 此类是位于 TIFFTAGS 类中的私有类。它的目的是包含所有的单页信息 可能在 tiff 中的页面。它是私有的,仅用于 内部目的。

    公共类 TIFFTAGS_TAG - 这是我制作的一个类,用于将标签包装成我喜欢的东西。使用标准标签类型名称,例如 ASCII、SHORT、LONG、 和理性。

    方法/功能:

    标签扩展器() - 这个小宝石是一个回调函数,可让您将 CUSTOM 标签实际保存在 tiff 中。没有它你所有的自定义标签 当您删除任何标签时会消失(即使您只是删除了 一)。

    删除TiffTags() - 这是删除标签列表的主要方法。只需传入一个 ushort 标签号列表,所有这些都将被删除。记住 不使用 TagExtender 功能将导致您的自定义标签消失

    删除TiffTag() - 这仅用于删除单个 tiff 标签。它调用 DeleteTiffTags() 来处理繁琐的工作。

    public static bool DeleteTiffTags(string sFileName, List<ushort> ushortTagNumbers)
    {
        //Deletes a list of tiff tag from the given image
        //Returns true if successful or false if error occured
         //Define variables
        List<TIFFTAGS_PAGE> ttPage = new List<TIFFTAGS_PAGE>();
         //Check for empty list
        if (ushortTagNumbers.Count == 0) return false;
         try
        {
            //ADDED
            m_lTagsToWrite = new List<TIFFTAGS_TAG>();
            m_lTagsToWrite.Add(new TIFFTAGS_TAG("", 38001, Convert.ToString("")));
            m_lTagsToWrite.Add(new TIFFTAGS_TAG("", 38002, Convert.ToString("")));
            m_parentExtender = Tiff.SetTagExtender(TagExtender);
             //Open the file for reading
            using (Tiff input = Tiff.Open(sFileName, "r"))
            {
                if (input == null) return false;
                 //Get page count
                int numberOfDirectories = input.NumberOfDirectories();
                 //Go through all the pages
                for (short i = 0; i < numberOfDirectories; ++i)
                {
                    //Set the page
                    input.SetDirectory(i);
                     //Create a new tags dictionary to store all my tags
                    Dictionary<ushort, FieldValue[]> dTags = new Dictionary<ushort, FieldValue[]>();
                     //Get all the tags for the page
                    for (ushort t = ushort.MinValue; t < ushort.MaxValue; ++t)
                    {
                        TiffTag tag = (TiffTag)t;
                        FieldValue[] tagValue = input.GetField(tag);
                        if (tagValue != null)
                        {
                            dTags.Add(t, tagValue);
                        }
                    }
                     //Check if the page is encoded
                    bool encoded = false;
                    FieldValue[] compressionTagValue = input.GetField(TiffTag.COMPRESSION);
                    if (compressionTagValue != null)
                        encoded = (compressionTagValue[0].ToInt() != (int)Compression.NONE);
    
                    //Create a new byte array to store all my image data
                    int numberOfStrips = input.NumberOfStrips();
                    byte[] byteImageData = new byte[numberOfStrips * input.StripSize()];
                    int offset = 0;
                     //Get all the image data for the page
                    for (int n = 0; n < numberOfStrips; ++n)
                    {
                        int bytesRead;
                        if (encoded)
                            bytesRead = input.ReadEncodedStrip(n, byteImageData, offset, byteImageData.Length - offset);
                        else
                            bytesRead = input.ReadRawStrip(n, byteImageData, offset, byteImageData.Length - offset);
                         //Add to the offset keeping up with where we are
                        offset += bytesRead;
                    }
                     //Save all the tags, image data, and height, etc for the page
                    TIFFTAGS_PAGE tiffPage = new TIFFTAGS_PAGE();
                    tiffPage.Height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt();
                    tiffPage.Tags = dTags;
                    tiffPage.PageData = byteImageData;
                    tiffPage.Encoded = encoded;
                    tiffPage.StripSize = input.StripSize();
                    tiffPage.StripOffset = input.GetField(TiffTag.STRIPOFFSETS)[0].ToIntArray()[0];
                    ttPage.Add(tiffPage);
                }
            }
             //Open the file for writing
            using (Tiff output = Tiff.Open(sFileName + "-new.tif", "w"))
            {
                if (output == null) return false;
                 //Go through all the pages
                for (short i = 0; i < ttPage.Count(); ++i)
                {
                    //Write all the tags for the page
                    foreach (KeyValuePair<ushort, FieldValue[]> tagValue in ttPage[i].Tags)
                    {
                        //Write all the tags except the one's needing to be deleted
                        if (!ushortTagNumbers.Contains(tagValue.Key))
                        {
                            TiffTag tag = (TiffTag)tagValue.Key;
                            output.GetTagMethods().SetField(output, tag, tagValue.Value);
                        }
                    }
                     //Set the height for the page
                    output.SetField(TiffTag.ROWSPERSTRIP, ttPage[i].Height);
                     //Set the offset for the page
                    output.SetField(TiffTag.STRIPOFFSETS, ttPage[i].StripOffset);
                     //Save page data along with tags
                    output.CheckpointDirectory();
                     //Write each strip one at a time using the same orginal strip size
                    int numberOfStrips = ttPage[i].PageData.Length / ttPage[i].StripSize;
                    int offset = 0;
                    for (int n = 0; n < numberOfStrips; ++n)
                    {
                        //Write all the image data (strips) for the page
                        if (ttPage[i].Encoded)
                            //output.WriteEncodedStrip(n, byteStrip, offset, byteStrip.Length - offset);
                            output.WriteEncodedStrip(0, ttPage[i].PageData, offset, ttPage[i].StripSize - offset);
                        else
                            output.WriteRawStrip(n, ttPage[i].PageData, offset, ttPage[i].StripSize - offset);
                         //Add to the offset keeping up with where we are
                        offset += ttPage[i].StripOffset;
                    }
                     //Save the image page
                    output.WriteDirectory();
                }
            }
             //ADDED
            Tiff.SetTagExtender(m_parentExtender);
        }
        catch
        {
            //ADDED
            Tiff.SetTagExtender(m_parentExtender);
    
            //Error occured
            return false;
        }
         //Return success
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多