2011-09-16 3 views
1

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

POCには、「image1.gif」と「image2.gif」の2つの画像があり、どちらも256x256です。目的はそれらを水平に1つの画像 "image3.png"(512x256)に連結することです。 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; 
} 

は私は何を取得することは、画像の左側にその全体が最初のイメージ(image1)と、正しい寸法512x256の画像であり、画像の右側完全に黒。つまり、image1.gifを256x256の黒い四角で連結したような感じです。

MosaicTypeをMosaicDescriptor.MOSAIC_TYPE_BLENDに変更しようとしましたが、これはちょうど左半分のみがimage2の上にオーバーレイされたイメージ1(またはその逆)から構成されます。

ImageLayoutコンストラクタの最初の2つのパラメータを変更しようとしました。これはどちらでも動作しません。たとえば、ImageLayoutの最初のパラメータを-256に設定できますが、image1は画像の右半分に表示され、画像の左半分は黒く表示されます。

助けてください!

+0

JAIでモザイクを作成する方法についてはわかりませんが、JAIとJAI/ImageIOをダウンロードする場所を教えてください。私は私の心を失っている...ありがとう! – Gevorg

+1

うん、それは奇妙だ、私が行ったリンクのように見える、もう存在しない。しかし、バイナリはhttp://download.java.net/media/jai/builds/release/1_1_3/ – Kidburla

+0

で入手できます。非常に奇妙です。ありがとうございます。あなたはjai-imageioの場所を知っていますか? 1つだけ?ありがとう! – Gevorg

答えて

0

ここで私が思いついた最終的な解決策です。これらの一般的な方法は、2つの画像のモザイクを作成して示しています。共通の座標空間にマッピングするだけです。まず、ある画像のモザイクを作成します(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); 
} 
0

ここでは、JAIを使用して2つの画像をモザイク化するための、より簡潔な方法を示します。基本的なプロセスは、ソースイメージをモザイクの共通イメージスペースに変換(またはワープ)することです。次に、すべての翻訳されたイメージをモザイク操作に供給することができます。 2つのモザイク操作を実行する必要はありません。すべての入力画像の画像空間の和集合がモザイクの出力画像空間に対応するため、RenderingHintとしてImageLayoutを指定する必要はありません。この例では、入力画像はメモリに作成されますが、元の投稿と同様にファイルから読み込むことができます。

public void makeMosaic(String fileName) throws IOException{ 
     // Make a black image in memory 
     RenderedImage blackImage = ConstantDescriptor.create(256f,256f,new Byte[]{0x00,0x00,0x00},null); 
     // Make a white image in memory 
     RenderedImage whiteImage = ConstantDescriptor.create(256f, 256f, new Byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff},null); 
     // Translate the white image to shift it 256 pixels to the right 
     RenderedImage translatedWhiteImage = TranslateDescriptor.create(whiteImage, 256f, 0f, new InterpolationNearest(), null); 
     // Now you can mosaic the two images. No need to supply an ImageLayout hint or pre-mosaic the black image. 
     RenderedImage mosaic = MosaicDescriptor.create(new RenderedImage[]{blackImage,translatedWhiteImage}, MosaicDescriptor.MOSAIC_TYPE_OVERLAY, null, null, null, null, null); 
     // Write out the output image. Should be 256 pixels tall and 512 pixels wide with black tile on left and white tile on right. 
     ImageIO.write(mosaic, "PNG", new File(fileName)); 
    } 
関連する問題