2

だから私はずっと投稿してきましたが、まだ確かな答えを得ていません:

切り抜きメソッドを使用して、画像のサイズ変更クラスを作成しました。トリミングはうまく機能します。私が抱えている問題は、drawImage関数で指定した背景色がGraphics正しく機能していないことです。私が提供するものに関係なく、背景としてデフォルトで黒になります(この場合は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);
}
4

2 に答える 2

1

画像を壊しているのが Graphics メソッドなのか ImageIO メソッドなのかを特定できますか? ImageIO プロセス全体を短絡し、単純に割り当てることで、これをテストできるようです。

this.OutputImage = NewImage;

さらに言えば、ImageIO 操作によって得られるものがあると思いますか? サンプルが書かれているので、(理想的には) ノーオペレーションのように見えます。

また、ImageIO プロセスを開始する前に Graphics2D を破棄しません。多くの場合、違いはありませんが、それを想定したくありません。

于 2009-03-14T00:43:46.120 に答える
1

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

于 2009-03-14T21:26:51.040 に答える