Преобразование изображения tif с прозрачным фоном вызывает черный фон Java Jai ​​

Я пытаюсь преобразовать изображение в формате tiff с прозрачным фоном в jpeg, чтобы изменить размер до 200x200 или 1200x1200, но при преобразовании фон становится черным, я хочу сохранить фон прозрачным или белым после преобразования

Мой код следующий:

public static void TiffToJpg(String tiff, String output) throws IOException {
        File tiffFile = new File(tiff);
        SeekableStream s = new FileSeekableStream(tiffFile);
        TIFFDecodeParam param = null;
        ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
        RenderedImage op = dec.decodeAsRenderedImage(0);
        FileOutputStream fos = new FileOutputStream(output);

        JPEGEncodeParam jpgparam = new JPEGEncodeParam();
        jpgparam.setQuality(100);
        ImageEncoder en = ImageCodec.createImageEncoder("jpeg", fos, jpgparam);
        en.encode(op);

        BufferedImage in = javax.imageio.ImageIO.read(new java.io.File("oi.jpg"));

        BufferedImage out = scaleImage(in, BufferedImage.TYPE_INT_RGB, 200, 200);
        javax.imageio.ImageIO.write(out, "JPG", new java.io.File("thumbnail.jpg"));

        BufferedImage out2 = scaleImage(in, BufferedImage.TYPE_INT_RGB, 1200, 1200);
        javax.imageio.ImageIO.write(out2, "JPG", new java.io.File("web-image.jpg"));

        fos.flush();
        fos.close();
    }

    public static void main(String[] args) throws Exception {
        Tiffthumbs.TiffToJpg("oi.tif", "oi.jpg");
    }

    public static BufferedImage scaleImage(BufferedImage image, int imageType, int newWidth, int newHeight) {
        // Make sure the aspect ratio is maintained, so the image is not distorted
        double thumbRatio = (double) newWidth / (double) newHeight;
        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);
        double aspectRatio = (double) imageWidth / (double) imageHeight;

        if (thumbRatio < aspectRatio) {
            newHeight = (int) (newWidth / aspectRatio);
        } else {
            newWidth = (int) (newHeight * aspectRatio);
        }

        // Draw the scaled image
        BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D graphics2D = newImage.createGraphics();
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        graphics2D.drawImage(image, 0, 0, newWidth, newHeight, null);

        return newImage;
    }

Как это сделать в java JAI?


person Mister B    schedule 25.06.2018    source источник
comment
Поддерживает ли JPG прозрачность? BufferedImage.TYPE_INT_RGB создает непрозрачный BufferedImage. или белый после преобразования, затем залейте целевое изображение белым цветом, прежде чем закрашивать мастер-изображение   -  person MadProgrammer    schedule 25.06.2018


Ответы (1)


Измените функцию изображения масштаба на приведенный ниже фрагмент кода, и он должен работать. Что он делает, так это просто перекрашивает полное изображение в белый цвет, прежде чем рисовать фактическое изображение:

public static BufferedImage scaleImage(BufferedImage image, int imageType, int newWidth, int newHeight) {
        // Make sure the aspect ratio is maintained, so the image is not distorted
        double thumbRatio = (double) newWidth / (double) newHeight;
        int imageWidth = image.getWidth(null);
        int imageHeight = image.getHeight(null);
        double aspectRatio = (double) imageWidth / (double) imageHeight;

        if (thumbRatio < aspectRatio) {
            newHeight = (int) (newWidth / aspectRatio);
        } else {
            newWidth = (int) (newHeight * aspectRatio);
        }

        // Draw the scaled image
        BufferedImage newImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D graphics2D = newImage.createGraphics();
        graphics2D.setColor(Color.WHITE);
        graphics2D.fillRect(0, 0, newWidth, newHeight);
        graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        graphics2D.drawImage(image, 0, 0, newWidth, newHeight, null);

        return newImage;
    }

Без изменений:

введите здесь описание изображения

После изменения:

введите здесь описание изображения

person Aman Chhabra    schedule 25.06.2018
comment
работает нормально, вы знаете, как мне сохранить то же качество изображения? - person Mister B; 25.06.2018
comment
@MisterB Поскольку вы уменьшили размер изображения, вы потеряете качество. - person Aman Chhabra; 25.06.2018