Преобразование TYPE_4BYTE_ABGR в TYPE_3BYTE_BGR - PullRequest
4 голосов
/ 03 декабря 2010

У меня есть BufferedImage TYPE_4BYTE_ABGR imageType с прозрачностью, и я хочу преобразовать его в TYPE_3BYTE_BGR BufferedImage.Я попытался нарисовать изображение TYPE_4BYTE_ABGR на изображении TYPE_3BYTE_BGR, но оно изменило цвета.

Цель состоит в том, чтобы поместить прозрачное изображение на белый фон, потому что, если просто записать изображение TYPE_4BYTE_AGBR в .jpg, он получит черную прозрачную область.

1 Ответ

1 голос
/ 19 сентября 2013

Это код, который вам нужен, вы должны поместить тот же цвет со 100% альфа в новое изображение с альфа каналом.

// bufferedImage is your image.
if (bufferedImage.getType() == BufferedImage.TYPE_3BYTE_BGR) {
    BufferedImage bff = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
    for (int y = 0; y < bufferedImage.getHeight(); ++y) {
        for (int x = 0; x < bufferedImage.getWidth(); ++x) {
        int argb = bufferedImage.getRGB(x, y);
        bff.setRGB(x, y, argb & 0xFF000000); // same color alpha 100%
        }
    }
    return bff;
} else {
    return bufferedImage;
}

если вы хотите поместить прозрачное изображение на белый фон, вам действительно следует использовать новый BufferedImage с другим типом. Код для этого:

// bufferedImage is your image.
if (bufferedImage.getType() == BufferedImage.TYPE_4BYTE_ABGR) {
    for (int y = 0; y < bufferedImage.getHeight(); ++y) {
        for (int x = 0; x < bufferedImage.getWidth(); ++x) {
            int argb = bufferedImage.getRGB(x, y);
            if((argb & 0x00FFFFFF) == 0x00FFFFFF){ //if the pixel is transparent
                bufferedImage.setRGB(x, y, 0xFFFFFFFF); // white color.
            }
        }
    }
    return bufferedImage;
}
...