2013-04-30 3 views
2

이 이미지를 메모리에로드하지 않고 * .tif 이미지의 일부를로드하는 방법.전체 이미지를 메모리에로드하지 않고 TIFF 이미지의 일부를로드하는 방법은 무엇입니까?

큰 TIFF 파일로 작업해야합니다. (4GB 이상). BinaryReader을 사용하여이 파일을 읽으려고 시도했으며 BitMiracle.LibTiff.Classic을 사용하여 바이트를 이미지로 변환했습니다. 그러나 TIFF 파일의 특정 픽셀을 읽는 방법에 대한 예제를 찾지 못했습니다.

아마도이 작업을위한 해결책이 있습니까?

ImagePart with User Defined Width 
ImagePart with User Define Height 
ImagePArt with User Defined Location 

이 질문은, 어떻게 BigScan.tif에서 ImagePart를 얻을 수있다 :

Image Compression - NONE 
Pixel Order  - Interleaved (RGBRGB) 
Byte Order  - IBM PC 

나는 몇 가지 변수가 :

내가 BigScan.tif 파일을 가지고 항상 말할 수 있습니다?

하지만 (x, y) 좌표가있는 "BigScan.tif"의 픽셀 정보를 읽는 것이 가장 좋습니다.

나는 같은 기능을, 지정된 장소에 BigScan.tif에서 픽셀을 읽을 필요가 :

public Color GetPixelColorFromTiffImage(string TiffFileName, int PixelPositionX, int PixelPositionY) 
{ 
    //Some Code 
    return returnedColor; 
} 

아주 이상한하지만 내 quastion unswer 지원 did`t. 누군가 그것을 알고 있을지도 모른다. 왜 코드의이 부분을 BitMiracle Samples에서 "-11512229", "-11838376"등과 같이 '래스터'배열 번호에 썼습니다.

using (Tiff image = Tiff.Open(fullImageLocation, "r")) 
     { 

      // Find the width and height of the image 
      FieldValue[] value = image.GetField(TiffTag.IMAGEWIDTH); 
      width = value[0].ToInt(); 

      value = image.GetField(TiffTag.IMAGELENGTH); 
      height = value[0].ToInt(); 

      int imageSize = height * width; 
      int[] raster = new int[imageSize]; 


      // Read the image into the memory buffer 
      if (!image.ReadRGBAImage(width, height, raster)) 
      { 
       MessageBox.Show("Could not read image"); 

      } 


      using (Bitmap btm = new Bitmap(200, 200)) 
      { 
       for (int i = 0; i < btm.Width; ++i) 
        for (int j = 0; j < btm.Height; ++j) 
         btm.SetPixel(i, j, getSample(i + 330, j + 30, raster, width, height)); 

       ReternedBitmap = btm; 
      } 
     }//using  
+1

이 정보가 도움이됩니까? http://bitmiracle.com/libtiff/help/how-to-read-tiff-scanlines-in-a-random-fashion.aspx –

+0

글쎄, 나는이 페이지를 보았다. 그러나 나는 그것이 어떻게 도울 수 있는지 아직도 생각하고있다. 어떻게 이것을 사용하여 픽셀의 위치를 ​​설정하고 메인 tif 파일에서 데이터를 읽을 수 있습니까? –

+1

이미지에서 임의의 수의 스켈링을 읽을 수 있습니다. 전체 너비 (x 좌표)를 가져야하는 경우에도 적어도 행 범위 (y 좌표)를 선택할 수 있습니다. 아마도 도움이 될까요? –

답변

0

질문이 명확하지 않습니다 (적어도 두 가지 질문이 필요합니다).

  • 가 새로운 이미지로 그 주사선의 일부를 복사

    1. 은 원본 이미지의 각 관련 주사선을 읽어

      더 큰 이미지의 일부를 잘라해야하는 경우

      는 당신은 할 필요가있다.

    다시 당신이 필요한 것보다 주어진 위치에서 단일 픽셀의 색상 값을 얻을 필요가있는 경우 :

    1. 그 팩이 주사선에 해당 바이트를 찾아 관련 주사선을 읽어 Color 구조로 바이트 수 또는

    Photometric, 0123을 지정하지 않았습니다.및 SamplesPerPixel 값을 사용하므로 정확히 어떤 점을 처리하는지 알기가 어렵습니다.

    아마도 여러분은 지리적 이미지에 직면했을 것입니다. 그렇다면, 그들은 아마도 RGB, 24bit, 타일을 바른 이미지입니다.

    타일링 된 이미지의 경우 한 번에 이미지의 작은 부분 (예 : 256x256 픽셀) 만 읽을 수 있습니다.그러나 이미지가 제거 된 경우에도 이러한 이미지의 스캔 라인 하나당 약 1MB의 메모리 (219,000 픽셀 * 픽셀 당 3 바이트)가 소요됩니다. 이러한 큰 이미지를 실제로 처리해야하는 경우에는 아무 것도 아닙니다.

    자신 만의 파서를 개발하는 것은 좋지 않습니다. TIFF 형식에 대한 기초 만 알고 있다면 쉽지 않습니다.

  • +0

    답변 해 주셔서 대단히 감사합니다. 당신 말이 맞아요, 이제는 내 자신의 "오프너"를 쓰는 데 문제가 있습니다. 사실 밝혀 졌기 때문에 실제로 파일의 지정을 알지 못합니다. (나는 BitMiracle이 도움이되기를 바랍니다. 코드의 일부? * .tiff 파일을 사용하면 나에게 진정한 마법이기 때문에. –

    관련 문제