Как загрузить часть изображения 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 ответ

Ваш вопрос неясен (вы задаете как минимум два разных вопроса).

Если вам нужно обрезать часть большего изображения, вам необходимо:

  1. прочитать каждую соответствующую строку развертки исходного изображения
  2. скопировать часть этой линии сканирования в новое изображение.

Если вам нужно получить значение цвета одного пикселя в заданном месте, то вам снова нужно:

  1. читать соответствующие строки
  2. найти соответствующие байты в этой строке сканирования
  3. упаковать эти байты в Color структура или что-то еще

Вы не указали, что Photometric, BitsPerSample а также SamplesPerPixel значения для вашего изображения, поэтому трудно сказать, с чем именно вы имеете дело.

Скорее всего, вы столкнулись с гео-изображениями. Если это так, то, вероятно, это RGB, 24-битные, мозаичные изображения.

Для мозаичных изображений можно прочитать только небольшую часть (скажем, 256 x 256 пикселей) изображения одновременно. Но даже если они будут удалены, одна строка сканирования такого изображения займет всего около 1 МБ памяти (219 000 пикселей * 3 байта на пиксель). Ничего, если вам действительно нужно обрабатывать такие большие изображения.

Я бы не советовал вам пытаться разрабатывать свой собственный парсер. Это не так просто, если вы знаете только основы формата TIFF.

Другие вопросы по тегам