LibTiff.Netライブラリを使用してtiffタグを削除する方法に関するドキュメントは見つかりません。私は図書室が大好きですが、この1つの方法は私がする必要があることにとって重要です。ある時点で、私はタグを設定し、それを何の価値もないと思っていました。私はそれがうまくいくと思っていたが、それは否定的だった。LibTiff.Net 2.3ライブラリを使用してtiffタグを削除する方法
誰かがLibTiff.Netライブラリを使ってtiffタグを削除する方法を知っていますか?
LibTiff.Netライブラリを使用してtiffタグを削除する方法に関するドキュメントは見つかりません。私は図書室が大好きですが、この1つの方法は私がする必要があることにとって重要です。ある時点で、私はタグを設定し、それを何の価値もないと思っていました。私はそれがうまくいくと思っていたが、それは否定的だった。LibTiff.Net 2.3ライブラリを使用してtiffタグを削除する方法
誰かがLibTiff.Netライブラリを使ってtiffタグを削除する方法を知っていますか?
注:これは大きな答えのように見えるかもしれませんが、これを見ている人は誰でも、私がすべてを清潔にするために作成した独自のクラスであることを確認したかったのです。できるだけソートして情報を得るために、私は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;
}
基本的に入力ファイルを新しい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に知られていないタグを削除します。ドロップしたいタグがリストにある場合は、そのリストからタグを削除して簡単に削除することができます。
LibTiff.Netに同梱されているTiffCPユーティリティ(特にソースコード)をご覧ください。
LibTiff.Netにはタグを削除する方法はありません(LibTiffについても同様です)。そのためには、のTiffCP機能を実装する必要があります。
基本的には、保持するすべてのタグをコピーし、ピクセルデータをコピーし、復号化せずにを再エンコードする必要があります。
Convert a multi-strip TIFF image to a single-strip oneサンプルもご覧ください。タグをコピーして生の(デコードされていないデータ)画像をある画像から別の画像にコピーする方法を示します。サンプルは実際にはストリップの数を変更する必要があるためデータをデコードしますが、データをデコードする必要はありません。
うわー!これはまさに私が何をしているかのように見えます。私はむしろ、公開された方法を扱い、私的なものに掘り下げる方がよいでしょう。 Bobobskyを指摘してくれてありがとう!そして、私はちょうど "投票アップ"特権も持っています...私は最初の投票をどこで使うのでしょうか? ;) –
「フィルタリング」部分がキーです。私はそれをどうやってやるか分からない。 tiffcp.exeを見て、ちょうど単純に異なるタイプの圧縮などでTIFFをコピーするようです。 –
あなたはexeではなくソースコードを調べるべきですか?私はいくつかの詳細と上記の答えを更新しました。 –
ありがとうMK、私は今C#コードを探しています。あなたがcで掲示したものに似たエリアを見つけました。それを掘り下げる時間。 ;) –