1

別の画像に追加する透明な背景を持つ PNG 画像があります。

私の問題はIplImage、背景を読み込んでいるときに背景がもう透明ではないことです-白に変わります。

javacvで背景が透明な画像を使用するにはどうすればよいですか?

IplImage src = cvLoadImage("2.png");
IplImage tmp = cvLoadImage("1.png");
cvSetImageROI(src, cvRect(41,28,tmp.width(),tmp.height())); // not the same size 
cvShowImage("1", src);  //before
cvCopy(src, tmp);
cvShowImage("2", src); //after
cvWaitKey(0);
cvResetImageROI(src);

アルファチャンネルを追加しようとしましたが、うまくいきませんでした:

Graphics g=src.getBufferedImage().getGraphics();
        Graphics2D g2d = (Graphics2D)g;
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                                                    10 * 0.1f));
        BufferedImage a = new BufferedImage(tmp.width(), tmp.height(), BufferedImage.TYPE_INT_ARGB);

        src = IplImage.createFrom(a);
4

1 に答える 1

2

thx アンドリュー、あなたはアルファについて正しかった :) 動作する同じものを見つけるためにもう少し検索が必要でしたが、ここにあります :)

public static void combine()
{
    try{
              File path = new File("D:/proj2/javacv2");

    // load source images

      BufferedImage image = ImageIO.read(new File(path, "3.jpg"));

      BufferedImage overlay = ImageIO.read(new File(path, "test4a.png"));

     // BufferedImage image=src.getBufferedImage();
   // BufferedImage overlay =tmp.getBufferedImage();
    // create the new image, canvas size is the max. of both image sizes
    int w = Math.max(image.getWidth(), overlay.getWidth());
    int h = Math.max(image.getHeight(), overlay.getHeight());
      //int w=tmp.width();
     // int h=tmp.height();
    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

    // paint both images, preserving the alpha channels
    Graphics g = combined.getGraphics();
    g.drawImage(image, 0, 0, null);
    g.drawImage(overlay, 41, 30, null);

    // Save as new image

       ImageIO.write(combined, "PNG", new File(path, "combined.png"));
    }catch(Exception e)
    {
        System.out.println("exception ");
    }

}
于 2012-09-10T21:58:04.803 に答える