2013-04-30 2 views
2

Как загрузить часть изображения * .tif без загрузки этого изображения в память.Как загрузить часть изображения TIFF без загрузки всего изображения в память?

Мне нужно работать с большими файлами 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) coorinates.

мне нужно прочитать пиксель из BigScan.tif в определенном месте, с такой функцией:

public Color GetPixelColorFromTiffImage(string TiffFileName, int PixelPositionX, int PixelPositionY) 
{ 
    //Some Code 
    return returnedColor; 
} 

Очень странно, но поддержка did`t unswer мой quastion. Может быть, кто-то это знает. Зачем дозировать эту часть кода от 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  
+1

Помогает ли это? http://bitmiracle.com/libtiff/help/how-to-read-tiff-scanlines-in-a-random-fashion.aspx –

+0

Ну, я видел эту страницу. Но мне все еще интересно, как это может помочь. Как, используя это, можно установить положение пикселя и прочитать его данные из основного файла tif? –

+1

Это позволяет вам читать любое количество масштабируемых изображений - так что вы можете, по крайней мере, выбрать диапазон строк (координата y), даже если вам нужно взять полную ширину (координата x) - может быть, это помогает? –

ответ

0

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

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

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

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

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

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

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

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

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

+0

Большое спасибо за ваш ответ. Вы правы, теперь у меня есть некоторые проблемы с написанием моего собственного «открывателя», потому что, как выяснилось, я действительно не знаю, как определить файлы ((я просто надеюсь, что BitMiracle поможет.) Могли бы вы помочь мне написать часть кода? Потому что это реальная магия для меня с * .tiff-файлами. –

Смежные вопросы