[英]How to load a part of a TIFF image without loading whole image into memory?
如何加载* .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
您的问题不清楚(您至少要问两个不同的问题)。
如果需要裁剪较大图像的一部分,则需要:
如果您需要获取给定位置中单个像素的颜色值,则需要再次:
Color
结构或其他任何形式 您没有为图像指定什么是Photometric
, BitsPerSample
和SamplesPerPixel
值,因此很难说出您到底要处理什么。
您很可能会遇到地理图像。 如果是这样,它们可能是RGB,24位平铺图像。
对于平铺图像,可以一次只读取图像的一小部分(例如256 x 256像素)。 但是,即使将它们剥离,一条这样的图像的一条扫描线也将仅占用大约1 MB的内存(219 000像素*每个像素3个字节)。 如果您真的需要处理这么大的图像,那没什么。
我不建议您尝试开发自己的解析器。 如果您仅了解有关TIFF格式的基础知识,那并不是那么容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.