2015-04-25 1 views
3

Ma tâche consiste à prendre un fichier GeoTIFF, à effectuer une segmentation d'image et à l'enregistrer dans le nouveau fichier GeoTIFF (avec les coordonnées existantes). Si je comprends bien, les coordonnées sont conservées dans les métadonnées GeoTIFF. donc je prends des métadonnées à partir du fichier d'origine:Ecriture de métadonnées GeoTIFF d'un fichier à un autre

File file = new File(inputFilePath); 
ImageInputStream iis = ImageIO.createImageInputStream(file); 
Iterator<ImageReader> readers = ImageIO.getImageReaders(iis); 
IIOMetadata metadata=null; 
ImageReader reader=null; 
if (readers.hasNext()) { 
    // pick the first available ImageReader 
    reader = readers.next(); 
    // attach source to the reader 
    reader.setInput(iis, true); 
    // read metadata of first image 
    metadata = reader.getImageMetadata(0); 
} 

Et quand je System.out.println("Metadata: "+metadata);, je vois l'arbre XML correct de metatags. Je suis un peu de magie avec l'image

System.out.println("Starting segmentation"); 
BufferedImage image = UtilImageIO.loadImage(inputImage); 
// Select input image type. Some algorithms behave different depending on image type 
ImageType<MultiSpectral<ImageFloat32>> imageType = ImageType.ms(3, ImageFloat32.class); 
ImageSuperpixels alg = FactoryImageSegmentation.fh04(new ConfigFh04(500, 30), imageType); 
// Convert image into BoofCV format 
ImageBase color = imageType.createImage(image.getWidth(), image.getHeight()); 
ConvertBufferedImage.convertFrom(image, color, true); 
// Segment and display results 
performSegmentation(alg, color); 
System.out.println("Segmentation finished"); 

En conséquence, j'obtenir un BufferedImage (resultBufferedImage) avec la segmentation d'images avec succès. Et ici commence mes problèmes, je suis en train de sauver ce BufferedImage avec anciennes métadonnées:

BufferedOutputStream out; 
    ImageWriter writer = ImageIO.getImageWriter(reader); 
    ImageOutputStream imgout = null; 
    FileOutputStream fos =null; 
    fos = new FileOutputStream(outputImage); 
    out = new BufferedOutputStream(fos); 
    imgout = ImageIO.createImageOutputStream(out); 
    writer.setOutput(imgout); 
    ImageWriteParam param = writer.getDefaultWriteParam(); 
    IIOImage destIIOImage = new IIOImage(resultBufferedImage, null, metadata); 
    System.out.println("Before write"); 
    writer.write(null, destIIOImage, null); 
    System.out.println("After write"); 

je suis imprimé « après écriture ». Mais le programme est toujours en cours d'exécution, j'ai essayé d'attendre, mais aucun résultat. Donc, quand je tue le processus, le fichier est créé avec succès, même avec des géodonnées. Comment puis-je déterminer la fin de l'écriture et arrêter le programme? p.s. Image dans le visualiseur Ubuntu par défaut semble être bien, mais quand je l'ai ouvert dans QGIS j'ai des champs transparents, et comment puis-je rendre l'arrière-plan gris transparent? enter image description here

Répondre