2016-10-05 6 views
0

У меня есть изображение tiff, и я читаю значения RGB каждого пикселя с помощью следующего кода. Высота изображения: 16198 ширина: 12900.Чтение значений RGB из изображения TIFF в C#

Но код занимает гораздо больше времени (более 20 минут). пробовал различный способ, как преобразовать его в растровое изображение, но не из них ведет к лучшей производительности. любые предложения

  using (Tiff tiffreader = Tiff.Open(imgpath, "r")) 
      { 
       img.Width = tiffreader.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
       img.Height = tiffreader.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 
       img.DipX = tiffreader.GetField(TiffTag.XRESOLUTION)[0].ToInt(); 
       img.DipY = tiffreader.GetField(TiffTag.YRESOLUTION)[0].ToInt(); 

       // Reading RGB values 
       int height = (int)img.Height; 
       int width = (int)img.Width; 
       int[] raster = new int[height*width]; 

       var b = tiffreader.ReadRGBAImage(width, height, raster); 

       img.Pixels = new PColor[height, width]; 
       img.Pixels = Utility.ConvertToRGB(height, width, raster); 
      } 


    internal static PColor[,] ConvertToRGB(int height, int width, int[] raster) 
    { 
     PColor[,] pcolor = new PColor[height, width]; 
     try 
     { 
      for (int i = 0; i < height; ++i) 
       for (int j = 0; j < width; ++j) 
       { 
        int offset = (height - j - 1) * width + i; 
        PColor color = new PColor(); 
        color.R = Tiff.GetR(raster[offset]); 
        color.G = Tiff.GetG(raster[offset]); 
        color.B = Tiff.GetB(raster[offset]); 

        pcolor[i, j] = color; 
       } 
     } 
     catch(Exception exp) 
     { 
      throw exp; 
     } 

     return pcolor; 
    } 
+0

Можете ли вы прочитать его в растровом изображении? Вы можете использовать Lockbits для быстрого доступа к нему. Что вы хотите делать с пикселями? – TaW

+0

Я пробовал с Bitmap, не улучшая производительность, я хочу использовать эти значения RGB для региона, растущего дальше вокруг некоторых начальных точек. – Manikanta

+0

Ключ не битмап, а Lockbits. Вы использовали это? Но чтение такого огромного файла в один битмап, вероятно, слишком много – TaW

ответ

0

Похоже, что вы делаете ненужную обработку файла. Весь цикл, который вызывает ReadScanline, кажется бессмысленным, так как вы просто прочитали весь файл позже с звонка на ReadRGBAImage. Я не уверен, какой класс поддерживает переменную img, но похоже, что в ней были дублированные данные (пикселей и bytearray переменная). Я бы посмотрел, если вы можете реорганизовать свой код, чтобы удалить один из этих элементов.

Было бы хорошо, чтобы изменить контуры для преобразования в RGB, чтобы иметь я (высоту) будут внутренний цикл так, что вы обращаетесь к растровому массиву в порядке (что экономит много памяти выбирает).

Также обратите внимание, что двумерный доступ к массиву значительно медленнее, чем 1d из-за проверки двойных границ. По моему собственному опыту на самом деле быстрее вычислять смещение массива 1d вручную, чем использовать массив C# 2d. Возможно, стоит рефакторинг Пиксели будут 1d.

EDIT: Если вы не можете реорганизовать код для удаления Пиксели или ByteArray,, то я хотел бы предложить создание ByteArray, содержимое переменной из содержимого растра вместо перечитывая снова файл ,

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

  • Нет связанных вопросов^_^