참고 : 처음에는 큰 대답처럼 보일 수 있지만이 사람이보고있는 모든 사람은 내가 모든 것을 청결하게 보관하기 위해 만든 독점적 인 수업이라는 것을 확실히하고 싶었습니다. 가능한 한 일종의 답을하고 정보를 얻으려면 DeleteTiffTags 메서드에 대한 코드 만 붙여 넣습니다. 나머지 코드는 here을 통해 다운로드 할 수 있습니다.
이제 좋은 물건들에 대해 ... 날이 발생하고 그것을 가능한 큰 stackoverflow 커뮤니티에 의해 답변되는 다양한 질문 덕분에 가능했다 .Tiff 태그를 삭제하려면 내 수업 중 하나를 두 가지 (아주 상세한) 메서드를 썼다. 첫 번째 목록을 삭제하기위한 것입니다. 주어진 태그 중 두 번째 태그는 t o 언급 된 메소드에서 작동하는 단일 태그를 삭제합니다. 또한이 예제에서 내 사용자 정의 tiff 태그를 지원하기 위해 몇 줄을 추가했습니다 ... 모두 앞에 // 추가 된 주석이 붙습니다.
클래스 :
이
공공 정적 클래스는 TIFFTAGS -이 클래스는 단순히 TIFFTAGS.DeleteTiffTags 같은 것을()를 수행하여 호출되는 기본 클래스입니다 그것은 정적 클래스이기 때문에 메소드를 사용하기 위해 객체를 생성 할 필요가 없습니다.
개인 클래스 TIFFTAGS_PAGE -이 클래스는 TIFFTAGS 클래스 내에있는 개인 클래스입니다. 그것은 모든 에 대한 모든 단일 페이지 정보를 tiff에 포함될 수있는 페이지에 포함시키는 것입니다. 사적인 용도로만 사용되며 내부 용으로 만 사용됩니다 ( ).
public class TIFFTAGS_TAG -이 태그는 내가 선호하는 태그를 더 많이 포장하기 위해 만들었습니다. ASCII, SHORT, LONG, 및 RATIONAL과 같은 표준 태그 유형 이름 사용.
방법/기능 :
TagExtender() -이 작은 보석은 당신이 실제로 티파니에서 사용자 정의 태그를 유지할 수 있도록하는 콜백 함수입니다. 태그가 없으면 모든 사용자 정의 태그 이 사라집니다 (심지어 만 삭제 했더라도).
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;
}
은 "필터링"부분이 중요하다. 내가 어떻게 그럴 수 있을지 모르겠다. tiffcp.exe에서 보았을 때 다른 형식의 압축 등으로 tiff를 복사하는 것처럼 보입니다. –
exe가 아닌 소스 코드를 살펴보아야합니까? 위의 답변을 몇 가지 세부 정보로 업데이트했습니다. –
감사합니다. MK, 지금 C# 코드를 살펴보고 있습니다. c에 게시 한 것과 비슷한 영역을 찾았습니다. 그것으로 파고 들어야 할 시간. ;) –