Моя задача - взять один 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, у меня есть прозрачные поля и как я могу сделать серый фон прозрачным?