2013-02-06 2 views
2

우리는 유형 6 OJPEG 압축 된 일부 TIFF 이미지를 보았습니다. 많은 이미지는 "8 8 8"의 BitsPerSample과 같으며 잘 작동합니다.Libtiff - 다른 BitsPerSample - 유효하거나 버그가있는 tiff 태그?

그러나 지금은 BitsPerSample 값이 "8 25608 0"인 것을 보았습니다. 이것이 가능한지 그리고 TIFF를 생성 한 시스템의 버그인지 여부는 궁금합니다. 가능하다면 BitsPerSample이 "8 8 8"이되도록 태그를 수정하여 잠재적으로 수정 될 수 있습니까?

현재 압축되지 않은 TIFF로 변환하여 처리 할 수있는 도구 (LEAD)가 하나뿐입니다. 분명히이 방법이 무엇인지 알지 못하며 아주 작은 문제를 해결하기위한 큰 오버 헤드가 있습니다. 소수의 이미지.

누구나이 문제에 직면 해 있거나 간단하지 않거나 수정하기가 복잡하다는 점에 관해서 나보다 많은 지식을 가진 사람이 있습니까? 지금까지 Libtiff.net 코드에서 파고 들기위한 내 시도가별로 성과가 없었습니다!

건배

UPDATE :이 같은 간단한와 litiff.net 사용 : (! 분명히 예외 처리를 생략)에

static void Main(string[] args) 
    { 
     using (Tiff image = Tiff.Open(args[0], "r")) 
     { 
      FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH); 
      int width = value[0].ToInt(); 

      Console.WriteLine(string.Format("Width = {0}", width)); 
     } 
    } 

결과 :

ReadDirectory : 경고, 10. TIF : 알 수없는 태그 33000 (0x80e8)이있는 필드 10.TIF : 필드 "BitsPerSample"에 대해 다른 샘플 당 값을 처리 할 수 ​​없음

처리되지 않은 예외 : System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다. C에서 tifftest.Program.Main (문자열 []에 인수)에서 : \ tiffstuff \ tifftest \ tifftest \ Program.cs : 선 (15) 분할 오류 지금 검사를 생략하고 8을 가정을 얻고있다

다음 나는 분명히 OJPEG의 경고를

  using (Bitmap bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb)) 
      { 
       Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); 

       BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
       byte[] bits = new byte[bmpdata.Stride * bmpdata.Height]; 

       for (int y = 0; y < bmp.Height; y++) 
       { 
        int rasterOffset = y * bmp.Width; 
        int bitsOffset = (bmp.Height - y - 1) * bmpdata.Stride; 

        for (int x = 0; x < bmp.Width; x++) 
        { 
         int rgba = raster[rasterOffset++]; 
         bits[bitsOffset++] = (byte)((rgba >> 16) & 0xff); 
         bits[bitsOffset++] = (byte)((rgba >> 8) & 0xff); 
         bits[bitsOffset++] = (byte)(rgba & 0xff); 
        } 
       } 

       System.Runtime.InteropServices.Marshal.Copy(bits, 0, bmpdata.Scan0, bits.Length); 
       bmp.UnlockBits(bmpdata); 

       bmp.Save("c:\\tiffstuff\\TiffTo24BitBitmap.bmp"); 
      } 

과 : OJPEGReadHeaderInfoSecTablesQTable : 누락 된 JPEG 테이블을 "BitsPerSample는"그러나 나는 이제 bitmiracle 사이트의 예를 사용하여 BMP로 저장하여 이미지를 추출하기 위해 노력하고있어

결과 이미지는 단지 100 % 녹색입니다.

이 문제를 해결하기에는 너무 먼 곳에 있습니다. 나는 JPEG가 어딘가에 있다는 것을 안다. 그리고 그것을 성공적으로 압축 해제하는 것처럼 보이지 않을 것이다 :-(

+0

컬러 또는 회색조 이미지로 작업하고 있습니까? 그냥 추측하지만, _SamplesPerPixel_가 1로 설정되면, 나는 "8"이 될 1 개의 값을 읽을 필요가 있다고 생각합니다. 그레이 스케일 이미지의 경우입니다. 컬러 이미지는 픽셀 당 3 개의 샘플 (RGB)을 사용하며 각 채널에 대해 "8"이 필요합니다. 이미지에 대해 무엇을하고 있으며 실패한 부분의 코드를 보여줄 수 있습니까? –

+0

그들은 RGB 이미지입니다. 몇 가지 기본 코드로 원래 질문을 업데이트했습니다. 문제를 해결하려면 BitsPerSample 태그를 "8 8 8"로 변경하면 파일을 열어서 테스트 할 수 없습니다. 성공적으로 열면 JPEG로 저장하려고합니다. – Simon

답변

1

25608의 비트 심도는 틀린데, JPEG 압축은 픽셀 당 8 비트가 아닌 다른 비트 심도를 결코 사용하지 않는다. 픽셀 당 16 비트 또는 32 비트를 사용할 수 있지만 일반 응용 프로그램에 비해 높은 이미지 형식이 있습니다.

JPEG에는 RGB 이미지 즉 "8 8 8", CMYK 이미지 즉 "8 8 8 8"및 단색 이미지, 즉 "8"이 표시됩니다.

이미지가 CMYK 일 수 있으며 사용하는 소프트웨어가이를 지원하지 않을 수 있습니다. RGB로 변환하여 해당 소프트웨어에서 사용할 수 있습니다.

이미지가 RGB이면 태그가 손상되어 이미지를 잘 고정시킬 수 있습니다. (물론 그 밖의 다른 것들도 빠져 있다고 가정 해보십시오.)

+0

정말 고맙습니다. RGB 이미지라고 생각합니다. Libtiff.net의 소스 코드를 사용해 보았습니다. 이전에 파일을 열려고 시도한 API를 사용하여 분명히 변경해야했습니다. 태그를 변경할 기회가 있습니다. 당신이나 다른 사람이 내가 어디에서/BitsPerSample이 손상된 경우이를 덮어 쓸 말을하기 위해 몇 가지 코드를 추가 할 수 있는지에 대해 어떤 포인터를 가지고 있습니까? 나는 지금까지 비참한 시도와 실패를 고백했다. – Simon

+0

@ 시몬 : 죄송합니다. 한번도 사용한 적이 없으므로 도와 드릴 수 없습니다. – Guffa

1

파일이 준 깨진 것 같습니다. @Guffa가 언급 한 바와 같이, 샘플 값 당 OJPEG 파일의 비트는 8 8 8 (RGB) 또는 8 8 8 8 (CMYK)이

불행하게도, LibTiff.Net이 BITSPERSAMPLE처럼 같은 중요한 태그를 복구 할 수있는 기회를 제공하지 않습니다 수 있어야합니다.

내가 볼 수있는 유일한 옵션은 이러한 파일에 대한 자동 수정 코드를 라이브러리에 추가하는 것입니다.

오류를 나타내는 코드는 Tiff_DirRead.cs 파일입니다 (아래 표시된 세 곳에서).

private bool fetchPerSampleShorts(TiffDirEntry dir, out short pl) 
{ 
    ... 
    for (ushort i = 1; i < check_count; i++) 
    { 
     if (v[i] != v[0]) 
     { 
      ErrorExt(this, m_clientdata, m_name, 
       "Cannot handle different per-sample values for field \"{0}\"", 
       FieldWithTag(dir.tdir_tag).Name); 
      failed = true; 
      break; 
     } 
    } 
    ... 
} 

private bool fetchPerSampleLongs(TiffDirEntry dir, out int pl) 
{ 
    ... 
    for (ushort i = 1; i < check_count; i++) 
    { 
     if (v[i] != v[0]) 
     { 
      ErrorExt(this, m_clientdata, m_name, 
       "Cannot handle different per-sample values for field \"{0}\"", 
       FieldWithTag(dir.tdir_tag).Name); 
      failed = true; 
      break; 
     } 
    } 
    ... 
} 

private bool fetchPerSampleAnys(TiffDirEntry dir, out double pl) 
{ 
    ... 
    for (ushort i = 1; i < check_count; i++) 
    { 
     if (v[i] != v[0]) 
     { 
      ErrorExt(this, m_clientdata, m_name, 
       "Cannot handle different per-sample values for field \"{0}\"", 
       FieldWithTag(dir.tdir_tag).Name); 
      failed = true; 
      break; 
     } 
    } 
    ... 
} 

당신은 if (v[i] != v[0]) 절 및 해당 오류 처리 코드를 제거하려고 할 수도 있습니다. 파일을 열 수있게 해줄 것이라고 생각합니다 (다른 문제가없는 경우).

그런 파일을 어떻게 든 변환하거나 적어도 패치 할 수 있습니다.

+0

비슷한 결론에 도달했지만 문제가 여전히 남아 있습니다. 잠시 시간을 내면 내 후속 답변을 참조하십시오. 그에 따라 질문을 업데이트했습니다. – Simon