2012-02-24 3 views
4

LibTiff.Net 라이브러리를 사용하여 tiff 태그를 삭제하는 방법에 대한 문서를 찾을 수없는 것 같습니다. 나는 도서관을 좋아하지만이 한 가지 방법은 내가해야 할 일에 중요하다. 어느 시점에서 나는 태그를 설정하고 아무 것도 가치가 없다는 것을 희망했다. 나는 그것이 효과가 있기를 바랐지만 그것이 부정적이었다.LibTiff.Net 2.3 라이브러리를 사용하여 tiff 태그를 삭제하는 방법

누구나 LibTiff.Net 라이브러리를 사용하여 tiff 태그를 삭제하는 방법을 알고 계십니까?

답변

1

참고 : 처음에는 큰 대답처럼 보일 수 있지만이 사람이보고있는 모든 사람은 내가 모든 것을 청결하게 보관하기 위해 만든 독점적 인 수업이라는 것을 확실히하고 싶었습니다. 가능한 한 일종의 답을하고 정보를 얻으려면 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; 
} 
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

와우! 이것은 정확히 내가 겪은 것처럼 보입니다. 나는 오히려 노출 된 방법을 다루고 개인적인 것들을 파고들 것이다. Bobrovsky를 지적 해 주셔서 감사합니다! 그리고 나는 방금 "투표권을 얻었습니다"특권을 가졌습니다 ... 내가 처음 투표를 할 곳이 어디일까요? ;) –