【发布时间】:2013-04-24 04:10:55
【问题描述】:
如何加载 *.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
问题是,我怎样才能从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
【问题讨论】:
-
我看到了这个页面。但我仍然想知道它如何提供帮助。如何使用它来设置像素的位置,并从主 tif 文件中读取数据?
-
它允许您从图像中读取任意数量的刻度 - 因此您至少可以选择一系列行(y 坐标),即使您必须采用全宽(x 坐标) -也许这有帮助?
-
对不起,我还是不明白。你能用readScinline写一个例子吗,我怎样才能得到坐标(x,y)的像素信息?
-
嗯,这并不理想,但它比加载整个图像要好 ;-) 由于基于行的压缩选项,我不知道 TIFF 的单像素访问器。
标签: c# tiff libtiff.net