如何加载TIFF图像的一部分而不将整个图像加载到内存中

本文关键字:图像 加载 内存 何加载 TIFF 一部分 | 更新日期: 2023-09-27 18:11:34

如何加载*.tif图像的一部分而不将该图像加载到内存中。

我必须处理大的TIFF文件。(> 4gb)。我尝试使用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.tif得到ImagePart ?

但是最好能够读取(x,y)坐标的"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    

如何加载TIFF图像的一部分而不将整个图像加载到内存中

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

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

  1. 读取源图像的每个相关扫描线
  2. 复制部分扫描线到新图像。

如果您需要获得给定位置的单个像素的颜色值,那么您需要再次:

  1. 读取相关扫描线
  2. 在扫描线中查找相关字节
  3. 将这些字节打包成Color结构或其他

您没有为您的图像指定Photometric, BitsPerSampleSamplesPerPixel的值,因此很难判断您究竟在处理什么。

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

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

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