3

如何加载 *.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) 坐标的“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    
4

1 回答 1

0

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

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

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

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

  1. 阅读相关扫描线
  2. 在该扫描线中查找相关字节
  3. 将这些字节打包成一个Color结构或其他任何东西

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

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

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

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

于 2013-04-30T16:16:37.973 回答