将 GeoTIFF 元数据从一个文件写入另一个文件
Write GeoTIFF metadata from one file to other
我的任务是获取一个 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 元标记树。
所以我对 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");
在结果中,我获得了一个图像分割成功的 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");
我打印了 "After write"。但是程序还是运行,我试着等待,但是没有结果。因此,当我终止进程时,即使使用地理数据,文件也会成功创建。如何确定编写完成并停止程序?
p.s。图片默认Ubuntu viewer看起来不错,但是我在QGIS里打开时有透明区域,如何让灰色背景透明?
不是真正的答案,但这里有两个关于如何使 TIFF 透明的答案:
我的任务是获取一个 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 元标记树。
所以我对 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");
在结果中,我获得了一个图像分割成功的 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");
我打印了 "After write"。但是程序还是运行,我试着等待,但是没有结果。因此,当我终止进程时,即使使用地理数据,文件也会成功创建。如何确定编写完成并停止程序?
p.s。图片默认Ubuntu viewer看起来不错,但是我在QGIS里打开时有透明区域,如何让灰色背景透明?
不是真正的答案,但这里有两个关于如何使 TIFF 透明的答案: