2009-03-13 15 views
2

私は全面的に投稿しており、まだ確かな答えを得ていません:イメージをJavaでオーバーレイするにはどうしたらいいですか?

私は画像のサイズ変更クラスを作成しました。作物は素晴らしい作品です。私が抱えている問題は、GraphicsdrawImage機能で指定した背景色が正しく機能していないことです。私は何を供給しても(この場合はColor.WHITE)、バックグラウンドとしてデフォルトで黒になります。

また、重ね合わせた画像または一番上の画像(ファイルからのもの)が反転している(そうでないと思われます)か、そうでなければ変色しています。ちょうどあなたが少しこれをより良い概念化することができます、私はJPEGを取って、新しいBufferedImageの上にそれをオーバーレイして、新しいバッファリングされたイメージの背景が設定されていません。

public void Crop(int Height, int Width, int SourceX, int SourceY) throws Exception { 
    //output height and width 
    int OutputWidth = this.OutputImage.getWidth(); 
    int OutputHeight = this.OutputImage.getHeight(); 

    //create output streams 
    ByteArrayOutputStream MyByteArrayOutputStream = new ByteArrayOutputStream(); 
    MemoryCacheImageOutputStream MyMemoryCacheImageOutputStream = new MemoryCacheImageOutputStream(MyByteArrayOutputStream); 

    //Create a new BufferedImage 
    BufferedImage NewImage = new BufferedImage(Width, Height, BufferedImage.TYPE_INT_RGB); 
    Graphics MyGraphics = NewImage.createGraphics(); 

    MyGraphics.drawImage(this.OutputImage, -SourceX, -SourceY, OutputWidth, OutputHeight, Color.WHITE, null); 

    // Get Writer and set compression 
    Iterator MyIterator = ImageIO.getImageWritersByFormatName("png"); 
    if (MyIterator.hasNext()) { 
     //get image writer 
     ImageWriter MyImageWriter = (ImageWriter)MyIterator.next(); 

     //get params 
     ImageWriteParam MyImageWriteParam = MyImageWriter.getDefaultWriteParam(); 

     //set outputstream 
     MyImageWriter.setOutput(MyMemoryCacheImageOutputStream); 

     //create new ioimage 
     IIOImage MyIIOImage = new IIOImage(NewImage, null, null); 

     //write new image 
     MyImageWriter.write(null, MyIIOImage, MyImageWriteParam); 
    } 

    //convert output stream back to inputstream 
    ByteArrayInputStream MyByteArrayInputStream = new ByteArrayInputStream(MyByteArrayOutputStream.toByteArray()); 
    MemoryCacheImageInputStream MyMemoryCacheImageInputStream = new MemoryCacheImageInputStream(MyByteArrayInputStream); 

    //resassign as a buffered image 
    this.OutputImage = ImageIO.read(MyMemoryCacheImageInputStream); 
} 

答えて

1

は、あなたはそれがあなたのイメージをマングリングされているグラフィックスメソッドまたはImageIOでの方法だかどうかを分離することができます:ここではそれ以下のコードは、私が働いていますか?あなたは全体のImageIOでプロセスを短絡し、簡単に言えば

this.OutputImage = NewImage; 

を割り当てることによってこれをテストすることができように見え、私はImageIOでの操作によって得られる何かがありますと仮定しますか?サンプルが書かれているので、(理想的には)ノーオペレーションであるように見えます。

また、ImageIOプロセスを開始する前にGraphics2Dを破棄しないでください。それはしばしば違いを生むものではありませんが、あなたはそれを想定したくありません。

+0

お返事ありがとうございました。ありがとうございました 隔離されている限り、私は奇妙なものをすべて取り除き、新しいバッファリングされたイメージとsetBackgroundColorを作成し、this.OutputImageに割り当てました。また、私はGraphics2Dではなく、Graphicsを使用しています。 –

+0

新しいコードの外観はどうですか?背景色のみを設定しても画像は変更されません。クリア操作(clearRect、おそらくGraphics2Dコンポジット)でのみ使用されます。ここ –

1

オーバーレイの色の歪みの問題では、グラフィックスコンテキストがペイントモードで、xorモードではないことを確認してください。 (Graphics.setPaintMode())。それ以外の場合、カラービットは一緒にXORされます。

+0

は、ソリューションです: \t \t \t \t //背景設定 \t \t \t \t MyGraphics.setBackground(Color.decodeの(this.BackgroundColor)); \t \t \t \t \t \t \t \t //クリアRECT \t \t \t \t MyGraphics.clearRect(0、0、幅、高さ)。 ご協力いただきありがとうございます。 –

関連する問題