2013-04-30 2 views
2

Comment charger une partie d'une image * .tif sans charger cette image dans la mémoire.Comment charger une partie d'une image TIFF sans charger l'image entière en mémoire?

Je dois travailler avec de gros fichiers TIFF. (> 4 Go). J'ai essayé de lire ce fichier en utilisant BinaryReader, et en utilisant BitMiracle.LibTiff.Classic pour convertir des octets en image. Mais je n'ai pas trouvé d'exemple pour savoir comment lire un pixel spécifique dans un fichier TIFF.

Peut-être avez-vous une solution pour cette tâche.

Disons que j'ai un fichier BigScan.tif et il est toujours:

Image Compression - NONE 
Pixel Order  - Interleaved (RGBRGB) 
Byte Order  - IBM PC 

J'ai une variable:

ImagePart with User Defined Width 
ImagePart with User Define Height 
ImagePArt with User Defined Location 

La question est, comment pourrais-je obtenir ImagePart de BigScan.tif?

Mais il serait préférable d'avoir la possibilité de lire l'information du pixel dans "BigScan.tif" avec (x, y) coorinates.

J'ai besoin de lire un pixel de l'BigScan.tif en place spécifiée, avec une telle fonction:

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

Très étrange, mais le did`t de soutien unswer mon quastion. Peut-être que quelqu'un le sait. Pourquoi doser cette partie du code de BitMiracle Samples pour écrire des numéros de tableau 'raster' comme "-11512229", "-11838376" et ainsi de suite.

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

Est-ce que cela aide? http://bitmiracle.com/libtiff/help/how-to-read-tiff-scanlines-in-a-random-fashion.aspx –

+0

Eh bien j'ai vu cette page. Mais je me demande toujours comment cela peut aider. Comment, en utilisant cela, possible de définir la position du pixel, et lire les données du fichier tif principal? –

+1

Il vous permet de lire n'importe quel nombre de scalines de l'image - de sorte que vous pouvez au moins choisir une rangée de rangées (coordonnées y), même si vous devez prendre toute la largeur (coordonnées x) - peut-être cela aide-t-il? –

Répondre

0

Votre question n'est pas claire (vous posez au moins deux questions différentes).

Si vous devez recadrer une partie d'une image plus grande, vous devez:

  1. lire chaque ligne de balayage pertinente d'une image source
  2. copie une partie de cette ligne de balayage à une nouvelle image.

Si vous avez besoin pour obtenir la valeur de couleur d'un pixel unique dans un endroit donné que encore une fois, vous devez:

  1. lire scanline pertinentes
  2. trouver octets pertinents dans cette ligne de balayage
  3. emballer les octets dans une structure Color ou quoi que ce soit

Vous n'avez pas précisé ce que sont Photometric, BitsPerSample et SamplesPerPixel valeurs pour votre image, il est donc difficile de dire exactement ce que vous traitez. Très probablement, vous faites face à des géo-images. Si oui, ils sont probablement RVB, 24 bits, mosaïque images.

Pour les images en mosaïque, il est possible de lire seulement une petite partie (par exemple, 256 x 256 pixels) de l'image à la fois.Mais même si elles sont dépouillées, une ligne de balayage d'une telle image ne prendra qu'environ 1 Mo de mémoire (219 000 pixels * 3 octets par pixel). Ce n'est rien si vous avez vraiment besoin de traiter de si grandes images.

Je ne vous recommande pas d'essayer de développer votre propre analyseur. Ce n'est pas si simple si vous ne connaissez que les bases du format TIFF.

+0

Merci beaucoup pour votre réponse. Vous avez raison, maintenant j'ai quelques problèmes avec l'écriture de mon propre "ouvreur" parce que, comme il s'est avéré - je ne sais pas exactement la spécification des fichiers ((J'espère juste que BitMiracle va aider.Pourriez-vous m'aider à écrire une partie du code? Parce que c'est vraiment magique pour moi avec les fichiers * .tiff. –

Questions connexes