如何在不将整个图像加载到内存的情况下加载TIFF图像的一部分?

时间:2013-04-30 09:29:04

标签: c# tiff libtiff.net

如何在不将此图像加载到内存中的情况下加载* .tif图像的一部分。

我必须处理大型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

问题是,如何从ImagePart获取BigScan.tif

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

我需要从指定位置的BigScan.tif读取一个像素,具有以下功能:

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

非常奇怪,但支持确实没有解决我的问题。可能有人知道。为什么要将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 个答案:

答案 0 :(得分:0)

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

如果您需要裁剪较大图像的一部分,则需要:

  1. 读取源图像的​​每个相关扫描线
  2. 将该扫描线的一部分复制到新图像。
  3. 如果您需要获取给定位置中单个像素的颜色值,则需要:

    1. 阅读相关扫描线
    2. 在该扫描线中找到相关字节
    3. 将这些字节打包成Color结构或其他任何
    4. 您没有为图片指定PhotometricBitsPerSampleSamplesPerPixel值,因此很难确定您究竟在处理什么。

      最有可能的是,你面临的是地理图像。如果是这样,它们可能是RGB,24位,平铺图像。

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

      我不建议您尝试开发自己的解析器。如果您只了解TIFF格式的基础知识,那就不那么容易了。