JAVA png图片缩放透明部分变成黑色

124 阅读1分钟

png图片缩放透明部分变成黑色


前言

最近在处理图片类型的时候发现了一个问题 当我读取处理缩放图片的时候 读取出来的图片 是png类型 背景是透明的 缩放后 原来png类型的图片源本透明部分 在处理后 变成了黑色

如图

读取 原图 处理缩放后 处理后

代码

   /**
     * 缩放图片。该方法根据给定的宽度和高度缩放 BufferedImage,并返回缩放后的 BufferedImage。
     *
     * @param originalImage 原始图片
     * @param newWidth 缩放后的宽度
     * @param newHeight 缩放后的高度
     * @return 缩放后的 BufferedImage
     */
    public static BufferedImage resizeImage(BufferedImage originalImage, int newWidth, int newHeight) {
        int scaleSmooth = Image.SCALE_SMOOTH;
        Image resultingImage = originalImage.getScaledInstance(newWidth, newHeight, scaleSmooth);
        int typeIntRgb = BufferedImage.TYPE_INT_RGB;
        BufferedImage outputImage = new BufferedImage(newWidth, newHeight, typeIntRgb);

        Graphics2D graphics2D = outputImage.createGraphics();
        isaBoolean(resultingImage, graphics2D);
        getDispose(graphics2D);

        return outputImage;
    }

    private static boolean isaBoolean(Image resultingImage, Graphics2D graphics2D) {
        return graphics2D.drawImage(resultingImage, 0, 0, null);
    }

    private static void getDispose(Graphics2D graphics2D) {
            graphics2D.dispose();
    }

解决方式

使用 AffineTransform 或 RescaleOp 进行自定义缩放。这里提供使用 AffineTransform 的示例:

/**
     * 缩放图片。该方法根据给定的宽度和高度缩放 BufferedImage,并返回缩放后的 BufferedImage。
     *
     * @param originalImage 原始图片
     * @param newWidth 缩放后的宽度
     * @param newHeight 缩放后的高度
     * @return 缩放后的 BufferedImage
     */
    public static BufferedImage resizeImage(BufferedImage originalImage, int newWidth, int newHeight) {
        BufferedImage resizeImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resizeImage.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        AffineTransform at = AffineTransform.getScaleInstance((double) newWidth / originalImage.getWidth(), (double) newHeight / originalImage.getHeight());
        g.drawRenderedImage(originalImage, at);

        g.dispose();
        return resizeImage;
    }

    private static boolean isaBoolean(Image resultingImage, Graphics2D graphics2D) {
        return graphics2D.drawImage(resultingImage, 0, 0, null);
    }

    private static void getDispose(Graphics2D graphics2D) {
            graphics2D.dispose();
    }

处理后

处理后