2012-02-24 24 views
4

LibTiff.Netライブラリを使用してtiffタグを削除する方法に関するドキュメントは見つかりません。私は図書室が大好きですが、この1つの方法は私がする必要があることにとって重要です。ある時点で、私はタグを設定し、それを何の価値もないと思っていました。私はそれがうまくいくと思っていたが、それは否定的だった。LibTiff.Net 2.3ライブラリを使用してtiffタグを削除する方法

誰かがLibTiff.Netライブラリを使ってtiffタグを削除する方法を知っていますか?

答えて

1

注:これは大きな答えのように見えるかもしれませんが、これを見ている人は誰でも、私がすべてを清潔にするために作成した独自のクラスであることを確認したかったのです。できるだけソートして情報を得るために、私はDeleteTiffTagsメソッドのコードを貼り付けます。残りのコードはhere経由でダウンロードできます。

今、良いものに...私は私はクラスの1つにtiffタグを削除するための2つの(非常に詳細な)メソッドを書きました。最初のものはリストを削除することです与えられたタグのうちの2つ目はt o上記の方法で動作する1つのタグを削除する。また、この例では、私のカスタムtiffタグをサポートするためにいくつかの行を追加しました。それらはすべて、追加されたコメントの前に置かれます。

クラス:

のpublic staticクラスTIFFTAGS - このクラスは、単にTIFFTAGS.DeleteTiffTags(のようなものをやってによって呼び出されるメインクラスです)。静的クラスであるため、 メソッドを使用するオブジェクトを作成する必要はありません。

プライベートクラスTIFFTAGS_PAGE - このクラスは、TIFFTAGSクラス内にあるプライベートクラスです。その目的は、すべて のすべての単一ページ情報をtiffに含まれるページに含めることです。それはプライベートであり、 内部目的でのみ使用されます。

パブリッククラスTIFFTAGS_TAG - これは、自分の好みに合わせてタグをまとめたクラスです。 ASCII、SHORT、LONG、 、RATIONALなどの標準タグタイプ名を使用する。

方法/機能:

TagExtender() - この小さな宝石は、あなたが実際にTIFFでカスタムタグを維持することができますコールバック関数です。それがなければ、すべてのカスタムタグ は、(たとえあなたがちょうど を削除したとしても)タグを削除すると消えます。

DeleteTiffTags() - タグのリストを削除する主な方法です。 ushortタグ番号のリストを渡すだけで、すべてが削除されます。 TagExtender関数を使用しないと、カスタムタグが移動します poof

DeleteTiffTag() - これは単純に単一の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; 
} 
1

基本的に入力ファイルを新しいTIFF画像にコピーして、処理したくないタグを除外しなければならないと思います。通常のlibtiffディストリビューションの一部であるtiffcpユーティリティを見てみましょう。これはフィルタリングを除いたものです。

免責事項:私はLibTiff.Netを使ったことがない、それはlibtiffのに非常によく似ていると仮定しています。

tiffcp.c

を見て、最初に、手動でコピー/それはW/O前にコピーすることができるすべてのタグセットのコピー次に、解像度、圧縮、色等 などのいくつかの既知のタグを設定します:

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

次に、実際のピクセルデータをコピーします。これは、私が思い出したものから、tiffcpに知られていないタグを削除します。ドロップしたいタグがリストにある場合は、そのリストからタグを削除して簡単に削除することができます。

+0

「フィルタリング」部分がキーです。私はそれをどうやってやるか分からない。 tiffcp.exeを見て、ちょうど単純に異なるタイプの圧縮などでTIFFをコピーするようです。 –

+0

あなたはexeではなくソースコードを調べるべきですか?私はいくつかの詳細と上記の答えを更新しました。 –

+0

ありがとうMK、私は今C#コードを探しています。あなたがcで掲示したものに似たエリアを見つけました。それを掘り下げる時間。 ;) –

3

LibTiff.Netに同梱されているTiffCPユーティリティ(特にソースコード)をご覧ください。

LibTiff.Netにはタグを削除する方法はありません(LibTiffについても同様です)。そのためには、のTiffCP機能を実装する必要があります。

基本的には、保持するすべてのタグをコピーし、ピクセルデータをコピーし、復号化せずにを再エンコードする必要があります。

Convert a multi-strip TIFF image to a single-strip oneサンプルもご覧ください。タグをコピーして生の(デコードされていないデータ)画像をある画像から別の画像にコピーする方法を示します。サンプルは実際にはストリップの数を変更する必要があるためデータをデコードしますが、データをデコードする必要はありません。

+0

うわー!これはまさに私が何をしているかのように見えます。私はむしろ、公開された方法を扱い、私的なものに掘り下げる方がよいでしょう。 Bobobskyを指摘してくれてありがとう!そして、私はちょうど "投票アップ"特権も持っています...私は最初の投票をどこで使うのでしょうか? ;) –

関連する問題