Java 将GeoTIFF元数据从一个文件写入另一个文件

Java 将GeoTIFF元数据从一个文件写入另一个文件,java,geotiff,boofcv,Java,Geotiff,Boofcv,我的任务是获取一个GeoTIFF,在中进行一些图像分割,并将其保存到新的GeoTIFF(使用现有坐标)。如果我理解正确,坐标将保留在GeoTIFF元数据中。 因此,我从原始文件中获取元数据: File file = new File(inputFilePath); ImageInputStream iis = ImageIO.createImageInputStream(file); Iterator<ImageReader> readers = ImageIO.getImageRe

我的任务是获取一个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);
 }
结果我获得了一个BuffereImage(resultBufferedImage),成功地进行了图像分割。 下面是我的问题,我正在尝试用旧元数据保存此BuffereImage:

  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");
“写完后”我会被打印出来。但程序仍在运行,我试图等待,但没有结果。因此,当我终止进程时,即使使用地理数据,文件也会成功创建。如何确定写入和停止程序的完成?
p、 默认Ubuntu viewer中的美国图像看起来不错,但当我在QGIS中打开它时,我有透明字段,如何使灰色背景透明?

不是真正的答案,但这里有两个关于如何使TIFF透明的答案:

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