如何加载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
你的问题不清楚(你至少问了两个不同的问题)。
如果你需要裁剪大图的一部分,那么你需要:
- 读取源图像的每个相关扫描线
- 复制部分扫描线到新图像。
如果您需要获得给定位置的单个像素的颜色值,那么您需要再次:
- 读取相关扫描线
- 在扫描线中查找相关字节
- 将这些字节打包成
Color
结构或其他
您没有为您的图像指定Photometric
, BitsPerSample
和SamplesPerPixel
的值,因此很难判断您究竟在处理什么。
最有可能的是,你面对的是地理图像。如果是这样,它们可能是RGB, 24位,平铺图像。
对于平铺图像,可以一次只读取图像的一小部分(例如,256 x 256像素)。但是,即使它们被剥离,这样一个图像的一条扫描线将只占用大约1mb的内存(219000像素* 3字节每像素)。如果你真的需要处理这么大的图像,那就没什么了。
我不建议您尝试开发自己的解析器。如果您只了解TIFF格式的基本知识,这并不容易。