Как загрузить часть изображения TIFF без загрузки всего изображения в память?
Как загрузить часть изображения в формате *.tif без загрузки этого изображения в память.
Я должен работать с большими файлами TIFF. (> 4 ГБ). Я пытался прочитать этот файл, используя 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
?
Но было бы лучше иметь возможность считывать информацию о пикселе в "BigScan.tif" с (x,y) координатами.
Мне нужно прочитать пиксель из BigScan.tif
в указанном месте, с такой функцией:
public Color GetPixelColorFromTiffImage(string TiffFileName, int PixelPositionX, int PixelPositionY)
{
//Some Code
return returnedColor;
}
Очень странно, но поддержка не перевернула мое мнение. Может быть, кто-то знает это. Зачем вводить эту часть кода из образцов BitMiracle, записанных в "растровые" номера массивов, например "-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
1 ответ
Ваш вопрос неясен (вы задаете как минимум два разных вопроса).
Если вам нужно обрезать часть большего изображения, вам необходимо:
- прочитать каждую соответствующую строку развертки исходного изображения
- скопировать часть этой линии сканирования в новое изображение.
Если вам нужно получить значение цвета одного пикселя в заданном месте, то вам снова нужно:
- читать соответствующие строки
- найти соответствующие байты в этой строке сканирования
- упаковать эти байты в
Color
структура или что-то еще
Вы не указали, что Photometric
, BitsPerSample
а также SamplesPerPixel
значения для вашего изображения, поэтому трудно сказать, с чем именно вы имеете дело.
Скорее всего, вы столкнулись с гео-изображениями. Если это так, то, вероятно, это RGB, 24-битные, мозаичные изображения.
Для мозаичных изображений можно прочитать только небольшую часть (скажем, 256 x 256 пикселей) изображения одновременно. Но даже если они будут удалены, одна строка сканирования такого изображения займет всего около 1 МБ памяти (219 000 пикселей * 3 байта на пиксель). Ничего, если вам действительно нужно обрабатывать такие большие изображения.
Я бы не советовал вам пытаться разрабатывать свой собственный парсер. Это не так просто, если вы знаете только основы формата TIFF.