我的任务是对一个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](https://istack.dev59.com/MY3qB.webp)