2014-11-26 5 views
0

저는 libtiff.net을 사용하여 jpeg에서 tiff를 만듭니다. tiff.writeScanLine이 false를 반환하기 때문에 쓰기를 시도 할 때 문제가 발생합니다. 이는 이미지가 tiff에 쓰여지지 않음을 의미합니다.libtiff.net writeScanLine은 false를 반환합니다.

왜 이런 일이 발생합니까? 어떻게 잘못되었는지 알아낼 수 있습니까?

여기에 코드의 다음 TIF-태그가 기록 된

private bool creatingTiff() 
 
     { 
 
      using (Bitmap bmp = new Bitmap(targetFile)) 
 
      { 
 
       using (Tiff tif = Tiff.Open("BitmapTo24BitColorTiff.tif", "w")) 
 
       { 
 
        byte[] raster = getImageRasterBytes(bmp, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
 
        tif.SetField(TiffTag.IMAGEWIDTH, bmp.Width); 
 
        tif.SetField(TiffTag.IMAGELENGTH, bmp.Height); 
 
        tif.SetField(TiffTag.COMPRESSION, Compression.OJPEG); 
 
        tif.SetField(TiffTag.PHOTOMETRIC, Photometric.YCBCR); 
 
        tif.SetField(TiffTag.SUBFILETYPE, 0); 
 
        tif.SetField(TiffTag.ROWSPERSTRIP, bmp.Height); 
 
        tif.SetField(TiffTag.ORIENTATION, BitMiracle.LibTiff.Classic.Orientation.TOPLEFT); 
 
        tif.SetField(TiffTag.XRESOLUTION, bmp.HorizontalResolution); 
 
        tif.SetField(TiffTag.YRESOLUTION, bmp.VerticalResolution); 
 
        tif.SetField(TiffTag.RESOLUTIONUNIT, ResUnit.INCH); 
 
        tif.SetField(TiffTag.BITSPERSAMPLE, 8); 
 
        tif.SetField(TiffTag.SAMPLESPERPIXEL, 3); 
 
        tif.SetField(TiffTag.JPEGIFOFFSET, 768); 
 
        tif.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 
 

 
        for (int i = 0, offset = 0; i < bmp.Height; i++) 
 
        { 
 
         bool b = tif.WriteScanline(raster, offset, i, 0); 
 
         Console.WriteLine("write succes: " + b); 
 
         offset += stride; 
 
        } 
 
       } 
 
       System.Diagnostics.Process.Start("BitmapTo24BitColorTiff.tif"); 
 
       return true; 
 
      } 
 
     } 
 
      
 

 
     private static byte[] getImageRasterBytes(Bitmap bmp, System.Drawing.Imaging.PixelFormat format) 
 
     { 
 
      System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height); 
 
      byte[] bits = null; 
 

 
      try 
 
      { 
 
       // Lock the managed memory 
 
       BitmapData bmpdata = bmp.LockBits(rect, ImageLockMode.ReadWrite, format); 
 

 
       // Declare an array to hold the bytes of the bitmap. 
 
       bits = new byte[bmpdata.Stride * bmpdata.Height]; 
 

 
       // Copy the values into the array. 
 
       System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, bits, 0, bits.Length); 
 

 
       // Release managed memory 
 
       bmp.UnlockBits(bmpdata); 
 
      } 
 
      catch 
 
      { 
 
       return null; 
 
      } 
 

 
      return bits; 
 
     } 
 
                   
 
     private static void convertSamples(byte[] data, int width, int height) 
 
     { 
 
      int stride = data.Length/height; 
 
      const int samplesPerPixel = 3; 
 

 
      for (int y = 0; y < height; y++) 
 
      { 
 
       int offset = stride * y; 
 
       int strideEnd = offset + width * samplesPerPixel; 
 

 
       for (int i = offset; i < strideEnd; i += samplesPerPixel) 
 
       { 
 
        byte temp = data[i + 2]; 
 
        data[i + 2] = data[i]; 
 
        data[i] = temp; 
 
       } 
 
      } 
 
     }

하지만 이미지 자체는 아니다. 아마도 누군가가 도서관 개발자 블로그 (BitMiracle)의 방향으로 나를 지적 할 수 있다면 직접 문제를 직접 제기 할 수 있습니다.

답변

0

난 당신의 코드는 다음과 같은 오류가 있다고 생각 :

  • 당신은 새로운 이미지를 Compression.OJPEG을 사용할 수 없습니다. Old-JPEG은 압축을 풀 수 있습니다.

  • 아마도 TiffTag.JPEGIFOFFSET 값을 직접 지정해서는 안됩니다. 라이브러리는 적절한 값 자체를 지정합니다.

  • WriteScanline 방법을 사용하여 전체 스트립을 쓰려고합니다. 대신 WriteEncodedStrip을 사용해야합니다.

또한 콘솔에서 방출되는 경고를 검토하는 데 도움이됩니다.

+0

문제는 OJPG 압축을 사용하여 TIFF에 JPEG를 저장해야한다는 것입니다. 이것을위한 또 다른 도서관/방법이 있습니까? – vanbrabants

+0

OJPEG 압축기에 대해 모르겠다. 죄송합니다. Btw, Old-JPEG 압축은 17-Mar-95 (거의 20 년 동안) 이후로 쓸모 없습니다. – Bobrovsky

관련 문제