2017-04-19 3 views
0

J'ai utilisé LibTiff.net pour recadrer une partie d'un Tiff en mosaïque et l'exporter sous forme de Tiff en mosaïque mais j'ai rencontré le problème de "Impossible d'écrire une image de tuiles sur une image dépouillée". Alors que le « Tiff.open (» out.tif », « w ») faire une image dépouillée, Comment puis-je créer une mosaïque-Tiff pour le remplir avec des données d'entrée?Créer un Tiff en mosaïque en utilisant LibTiff.net

using (Tiff input = Tiff.Open(@"E:\Sample_04.tif", "r")) 
     { 

      int width = input.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); 
      int height = input.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); 

      int tileWidth = input.GetField(TiffTag.TILEWIDTH)[0].ToInt(); 
      int tileLentgh = input.GetField(TiffTag.TILELENGTH)[0].ToInt(); 

      int samplesPerPixel = input.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt(); 
      int bitsPerSample = input.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); 
      int photo = input.GetField(TiffTag.PHOTOMETRIC)[0].ToInt(); 
      int config = input.GetField(TiffTag.PLANARCONFIG)[0].ToInt(); 

      int tiles = 0; 
      int tileSize = input.TileSize(); 
      byte[][] buffer = new byte[tileSize][]; 


      int tileHeightCount = height/tileLentgh; 
      int tileWidthCount = width/tileWidth; 


      for (int y = 0; y < tileLentgh*5; y += tileLentgh) 
      { 
       for (int x = 0; x < tileWidth*5; x += tileWidth) 
       { 
        buffer[tiles] = new byte[tileSize]; 
        input.ReadTile(buffer[tiles], 0, x, y, 0, 0); 
        tiles++; 
       } 
      } 


      // writing 
      using (Tiff output = Tiff.Open("out.tif", "w")) 
      { 

       output.SetField(TiffTag.SAMPLESPERPIXEL, samplesPerPixel); 
       output.SetField(TiffTag.IMAGEWIDTH, width); 
       output.SetField(TiffTag.IMAGELENGTH, height); 
       output.SetField(TiffTag.BITSPERSAMPLE, bitsPerSample); 
       output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0)); 
       output.SetField(TiffTag.PHOTOMETRIC, photo); 
       output.SetField(TiffTag.PLANARCONFIG, config); 

       int c = 0; 

       for (int y = 0; y < tileLentgh*5; y += tileLentgh) 
       { 
        for (int x = 0; x < tileWidth*5; x += tileWidth) 
        { 

         output.WriteTile(buffer[c], x, y, 0, 0); 
         c++; 
        } 
       } 
      } 
     } 
     System.Diagnostics.Process.Start("555.tif"); 

    } 
+0

Je ne suis pas développeur C# ou LibTiff.net, mais je suppose que le réglage de la 'TiffTag.ROWSPERSTRIP 'champ, est ce qui rend l'image" dépouillé ".Que se passe-t-il si vous supprimez cette ligne? – haraldK

+0

J'ai enlevé cette ligne avant de poser la question et rien ne s'est passé. Merci pour votre indice. –

+0

Je voudrais vous demander pourquoi vous multipliez 'tileLength' et' tileWidth' avec 5 dans les boucles for? (est-ce que la tuile est 5 fois plus grande qu'indiquée?) –

Répondre

0

Pour créer un fichier TIFF en mosaïque s'il vous plaît ne pas utiliser

output.SetField(TiffTag.ROWSPERSTRIP, output.DefaultStripSize(0)); 

et vous devez absolument mettre TiffTag.TILEWIDTH et TiffTag.TILELENGTH champs avant d'utiliser la méthode WriteTile.

+0

Oui, comme vous l'avez mentionné, j'ai ignoré les attributs width et tile length pour écrire mon fichier tiff. Merci beaucoup. –