[英]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.