2015-04-25 2 views
3

Моя задача - взять один GeoTIFF, внести некоторую часть изображения и включить его в новый GeoTIFF (с существующими координатами). Если я правильно понимаю, координаты сохраняются в метаданных GeoTIFF. Так я хватаю метаданные из исходного файла:Запись метаданных GeoTIFF из одного файла в другой

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); 
} 

И когда я System.out.println("Metadata: "+metadata);, я вижу правильный XML дерево метатеги. Так я же немного магии с изображением

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"); 

В результате я получить BufferedImage (resultBufferedImage) с успешно сегментации изображений. И здесь начинается мои проблемы, я пытаюсь сохранить этот BufferedImage со старыми метаданными:

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"); 

Я получаю печататься «После записи». Но программа все еще работает, я пытался подождать, но никаких результатов. Поэтому, когда я убиваю процесс, файл создается успешно, даже с геоданными. Как определить окончание написания и остановки программы? стр. Изображение в представлении Ubuntu по умолчанию кажется приятным, но когда я открыл его в QGIS, у меня есть прозрачные поля и как я могу сделать серый фон прозрачным? enter image description here

ответ

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