2013-04-30 99 views
2

如何加载* .tif图像的一部分而不将该图像加载到内存中。如何在不将整个图像加载到内存的情况下加载TIFF图像的一部分?

我必须使用大的TIFF文件。 (> 4 GB)。我尝试使用BinaryReader读取此文件,并使用BitMiracle.LibTiff.Classic将字节转换为图像。但是我没有找到如何读取TIFF文件中特定像素的示例。

也许你有这个任务的一些解决方案。

可以说我有一个BigScan.tif文件,它始终是:

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

我有一些变量:

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

的问题是,我怎么能得到BigScan.tifImagePart

但是最好能够用(x,y)坐标系读取“BigScan.tif”中像素的信息。

我需要在指定的地方读取来自BigScan.tif像素,具有这样的功能:

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

很奇怪,但是支持did`t unswer我quastion。可能有人知道它。为什么要将这部分代码从BitMiracle Samples写入'raster'数组编号,如“-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 – 2013-04-30 09:32:07

+0

嗯,我看到了这个页面。但我仍然想知道它是如何提供帮助的。如何使用它可以设置像素的位置,并从主tif文件中读取数据? – 2013-04-30 10:56:49

+1

它允许您从图像中读取任意数量的scalines - 所以即使您必须采用全宽(x坐标),您至少可以选择一系列行(y坐标) - 也许这有助于吗? – 2013-04-30 11:22:17

回答

0

你的问题不清楚(你问至少两个不同的问题)。

如果你需要裁剪较大的图像的一部分,那么你需要:

  1. 阅读源图像的每一个相关的扫描线
  2. 复制扫描线的一部分,以全新的形象。

如果你需要得到一个像素的颜色值在给定的位置不是再次,你需要:

  1. 阅读相关的扫描线
  2. 找到相关的字节在扫描线
  3. 收拾那些字节转换为Color结构或任何其他

您没有指定什么是Photometric,BitsPerSampleSamplesPerPixel值,因此很难说出你究竟在处理什么。

很可能,您正面临着地理图像。如果是这样,他们可能是RGB,24bit,瓷砖图像。

对于平铺图像,可以一次只读取图像的一小部分(比如256 x 256像素)。但即使它们被剥离,这种图像的一条扫描线也只会占用大约1 MB的内存(每个像素219 000个像素* 3个字节)。如果你真的需要处理如此大的图像,那没有什么。

我不建议你尝试开发自己的解析器。如果只知道关于TIFF格式的基本知识,那并不容易。

+0

非常感谢您的回答。你是对的,现在我在编写自己的“开场白”时遇到了一些问题,因为事实证明 - 我真的不知道文件的指定((。我只希望BitMiracle会帮助你,你能帮我写吗代码的一部分?因为它对于* .tiff文件来说真的很神奇。 – 2013-05-01 22:18:16

相关问题