2

私の問題を解決するためのアドバイスをいただければ幸いです。ボタンにたくさんの画像を重ねる必要がありますが、問題はこれがベース画像(歯)です:(http://i.imgur.com/7tIcP.gif)

私の最初の画像はこれです:http: //i.imgur.com/FYuD8.gif そして私はこれを置きます:http: //i.imgur.com/mWz9c.gif 最初の画像は2番目の画像と重なっているので私はただ見ることができます2番目の画像...

1つのオプションは、オーバーレイする前に画像の順序を変更することですが、ユーザーは最初の画像を選択し、最初の画像が必要な場合もありますが、それ以外の場合は、最初のAND、次に2番目の画像を入力します。逆に...

私のコードはこれです:

    BufferedImage large=null;
    large = ImageIO.read(new File("firstimage.gif"));

    BufferedImage small=null;

    small = ImageIO.read(new File("secondimage.gif"));

    int w = Math.max(large.getWidth(), small.getWidth());
    int h = Math.max(large.getHeight(), small.getHeight());

    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

    // paint both images, preserving the alpha channels
    Graphics g = combined.getGraphics();
    g.drawImage(large, 0, 0, null);
    g.drawImage(small, 0, 0, null);

    ImageIO.write(combined, "PNG", new File("twoInOne.png"));

    ImageIcon icon1 = new ImageIcon(combined);
    jbutton1.setIcon(icon1);

たぶん画像の問題のフォーマット、または私のコードですが、皆さんがこの問題で私を助けてくれることを願っていますありがとうございます。

今、私は3つの画像をアップロードしました:ベース画像(歯)をスキップします。それが問題になるとは思わないからです。

4

3 に答える 3

4

背景を透明にするために画像を編集する必要がありますか?

特定の色を透明にするには、 のピクセルを反復処理するBufferedImageか、適切な を使用しLookupOpます。後者については、ここで引用されている記事を参照してください。その後、 を使用して画像を結合できますdrawImage()。デフォルトの複合ルール でAlphaComposite.SRC_OVER十分です。そうでない場合は、ここに示すように変更できます。

于 2013-01-09T20:52:35.637 に答える
1

2つの画像を組み合わせるには、コードで問題ないはずです。ただし、おっしゃるように、2つの画像は同じサイズであり、透明度がないようです。これにより、2番目に描画される画像はすべて、新しく結合された画像の最初の画像を常に「上書き」します。

これにおそらく必要な解決策は、重ね合わせたいさまざまな部分を別々の小さな画像に分割することです。画像では、さまざまな情報を表示するために、歯の上にさまざまなオーバーレイを配置したいように見えます。この場合、歯の画像、赤いオーバーレイを含む画像、青いオーバーレイを含む画像の3つが必要になります。これらの3つの画像はすべて、以前に描画した画像の色を上書きしないように、白ではなく透明な背景にする必要があります。これを行うときは、歯を描き、次にオーバーレイ1(赤/青)、次にオーバーレイ2(赤/青)を描画する必要があります。これにより、探している出力が得られるはずです。

于 2013-01-09T16:47:44.280 に答える
0

重要なのは、アルファを float 値に設定することです。たとえば、2 つのレイヤーでアルファを 0.5 に設定し、3 つのレイヤーでアルファを 0.33 に設定し、4 つのレイヤーでアルファを 0.25 に設定します。とにかく、ここにコード例を示します。

try
{
    BufferedImage imgA = ImageIO.read(new File(imgAPath, token));
    BufferedImage imgB = ImageIO.read(new File(imgBPath, token));

    if (imgA.getWidth() == imgB.getWidth() && imgA.getHeight() == imgB.getHeight()) 
    {
        float alpha = 0.5f;
        int compositeRule = AlphaComposite.SRC_OVER;
        AlphaComposite ac;
        int imgW = imgA.getWidth();
        int imgH = imgA.getHeight();
        BufferedImage overlay = new BufferedImage(imgW, imgH, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = overlay.createGraphics();
        ac = AlphaComposite.getInstance(compositeRule, alpha);
        g.drawImage(imgA,0,0,null);
        g.setComposite(ac);
        g.drawImage(imgB,0,0,null);
        g.setComposite(ac);
        ImageIO.write(overlay, "PNG", new File(logFolder, browser+"__"+token));
        g.dispose();
    }
    else
    {
        System.err.println(token+" dymension not match ");
    }
}
catch (IOException e)
{
}
于 2016-05-18T16:32:59.693 に答える