gpt4 book ai didi

java - 用 jai 创建马赛克

转载 作者:行者123 更新时间:2023-12-01 05:39:49 27 4
gpt4 key购买 nike

我正在尝试将多个图像串联成一个,但遇到了问题。为了隔离这个问题,我创建了以下 POC,我正在尝试解决该问题,以便了解如何使用 JAI API。

在 POC 中,我有两个图像“image1.gif”和“image2.gif”,尺寸均为 256x256。目标是将它们水平连接成一个 512x256 的图像“image3.png”。这是我使用 JAI 为此编写的代码。

try {
InputStream stream1 = new FileInputStream("D:\\poc\\image1.gif");
InputStream stream2 = new FileInputStream("D:\\poc\\image2.gif");
RenderedImage image1 = ImageIO.read(stream1);
RenderedImage image2 = ImageIO.read(stream2);
ImageLayout imageLayout = new ImageLayout(0,0,512,256);
RenderingHints renderingHints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout);
RenderedImage finalImage = MosaicDescriptor.create(new RenderedImage[]{image1, image2}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
FileStoreDescriptor.create(finalImage, "D:\\poc\\image3.png", "PNG", null, null, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
} catch (IOException e) {
e.printStackTrace();
return;
}

我得到的是正确尺寸为 512x256 的图像,第一个图像 (image1) 完整地位于图像的左侧,而图像的右侧完全是黑色的。换句话说,就像我将 image1.gif 与 256x256 黑色方 block 连接起来。

我尝试将 MosaicType 更改为 MosaicDescriptor.MOSAIC_TYPE_BLEND,但这只会创建一个类似的图像,仅左半部分由覆盖在 image2 顶部的 image1 组成(反之亦然),而右半部分仍然完全黑色。

我还尝试更改 ImageLayout 构造函数的前两个参数。但这也不起作用 - 例如,我可以将 ImageLayout 的第一个参数设置为 -256,但随后 image1 显示在图像的右半部分,而图像的左半部分为黑色。

请帮忙!

最佳答案

这是我提出的最终解决方案 - 这些通用方法创建两个图像的马赛克来进行说明。您只需将它们映射到一个公共(public)坐标空间 - 首先创建一个图像的马赛克(以增加整体大小,因为 ScaleDescriptor 由于某种原因不起作用),然后翻译第二个图像,以便它可以与首先。

private static RenderedImage horizontalMosaic(RenderedImage image1, RenderedImage image2) {
ImageLayout imageLayout = new ImageLayout(0, 0, image1.getWidth() + image2.getWidth(), image1.getHeight());
RenderingHints renderingHints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout);
RenderedImage image3 = MosaicDescriptor.create(new RenderedImage[]{image1}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
RenderedImage image4 = MosaicDescriptor.create(new RenderedImage[]{image2}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
RenderedImage image5 = TranslateDescriptor.create(image4, (float)image1.getWidth(), 0.0f, null, renderingHints);
return MosaicDescriptor.create(new RenderedImage[]{image3, image5}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
}

private static RenderedImage verticalMosaic(RenderedImage image1, RenderedImage image2) {
ImageLayout imageLayout = new ImageLayout(0, 0, image1.getWidth(), image1.getHeight() + image2.getHeight());
RenderingHints renderingHints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, imageLayout);
RenderedImage image3 = MosaicDescriptor.create(new RenderedImage[]{image1}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
RenderedImage image4 = MosaicDescriptor.create(new RenderedImage[]{image2}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
RenderedImage image5 = TranslateDescriptor.create(image4, 0.0f, (float)image1.getHeight(), null, renderingHints);
return MosaicDescriptor.create(new RenderedImage[]{image3, image5}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, renderingHints);
}

关于java - 用 jai 创建马赛克,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7446806/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com