繁体   English   中英

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

[英]How to load a part of a TIFF image without loading whole image into memory?

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

我必须处理大型TIFF文件。 (> 4 GB)。 我尝试使用BinaryReaderBitMiracle.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

现在的问题是,我怎么能拿ImagePartBigScan.tif

但是,最好能够读取带有(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    

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

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

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

如果您需要获取给定位置中单个像素的颜色值,则需要再次:

  1. 阅读相关的扫描线
  2. 在该扫描线中找到相关的字节
  3. 将这些字节打包成Color结构或其他任何形式

您没有为图像指定什么是PhotometricBitsPerSampleSamplesPerPixel值,因此很难说出您到底要处理什么。

您很可能会遇到地理图像。 如果是这样,它们可能是RGB,24位平铺图像。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM