Search code examples
javajavacviplimage

javacv image with transparent background


I have a PNG image with transparent background that is to be added to another image.

My problem is that when I am loading the IplImage the background is not transparent anymore - it turns white.

How do I use image with transparent background in 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);

tryed to add alpha channl but didnt work:

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);

Solution

  • thx andrew you were right about alpha thinge :)did take me bit more serching to find same thing that works but here it is :)

    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 ");
        }
    
    }