Search code examples
javagraphics2d

Problems shearing BufferedImage with AffineTransform


I want to shear my images with AffineTransform in Java. If I do that I always get black bounds.

        for (File input : inputImages) {
        if (!input.getName().contains(".DS_Store")) {
            BufferedImage buffer = ImageIO.read(input);
            for (int i = 0; i <= 2; i++) {
                AffineTransform tx = new AffineTransform();
                tx.translate(buffer.getHeight() / 2, buffer.getWidth() / 2);
                tx.shear(0.3, 0);
                tx.translate(-buffer.getWidth() / 2, -buffer.getHeight() / 2);

                AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);

                BufferedImage newImage = new BufferedImage(buffer.getHeight(), buffer.getWidth(), buffer.getType());
                op.filter(buffer, newImage);

                File output = new File("output/" + FilenameUtils.getBaseName(input.getName()) + i + ".png");
                ImageIO.write(newImage, "png", output);
            }
        }
    }

Is there are way to avoid these black bounds and to get a white or transparent background?


Solution

  • Use BufferedImage.TYPE_INT_ARGB as the image type to create a transparent image

    If I use TYPE_ARGB my output image is completely transparent

    Works fine for more

    Shared Transparent Image

    BufferedImage buffer = ImageIO.read(...);
    AffineTransform tx = new AffineTransform();
    tx.translate(buffer.getHeight() / 2, buffer.getWidth() / 2);
    tx.shear(0.3, 0);
    tx.translate(-buffer.getWidth() / 2, -buffer.getHeight() / 2);
    
    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    
    BufferedImage newImage = new BufferedImage(buffer.getHeight(), buffer.getWidth(), BufferedImage.TYPE_INT_ARGB);
    op.filter(buffer, newImage);
    
    JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(newImage)));
    

    If you prefer, you could fill the newImage with a default color