1

複数の画像を 1 つに連結しようとしていますが、問題が発生しています。これを分離するために、JAI API の使用方法を理解するために解決しようとしている次の POC を作成しました。

POC には、256x256 の 2 つの画像 "image1.gif" と "image2.gif" があります。目的は、それらを水平方向に連結して、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 の黒い正方形に連結したようなものです。

MosaicType を MosaicDescriptor.MOSAIC_TYPE_BLEND に変更しようとしましたが、これは同様の画像を作成するだけで、左半分は image1 が image2 の上に重ねられたもの (またはその逆) で構成され、右半分はまだ完全に黒です。

また、ImageLayout コンストラクターの最初の 2 つのパラメーターを変更してみました。ただし、これも機能しません。たとえば、ImageLayout の最初のパラメーターを -256 に設定できますが、image1 は画像の右半分に表示され、画像の左半分は黒になります。

助けてください!

4

2 に答える 2

0

これが私が思いついた最終的な解決策です。これらの一般的な方法は、説明するために 2 つの画像のモザイクを作成します。それらを共通の座標空間にマッピングする必要があります-最初に1つの画像のモザイクを作成し(ScaleDescriptorが何らかの理由で機能しないため、全体のサイズを大きくするため)、次に2番目の画像を変換して、最初。

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);
}
于 2011-09-19T10:05:32.360 に答える