Question

Je suis en train (En Java) pour obtenir la couleur résultante quand je combine les 2 couleurs, l'une sur le dessus ayant une transparence alpha.En gros, je suis en train d'essayer d'attribuer une couleur de fond à une image, mais j'ai été vers le bas à chaque pixel d'être modifié individuellement.J'ai regardé plusieurs articles, y compris cette une, en vain.Quelqu'un sait comment effectuer ce type de RGBA/mélange de couleurs RVB?Mon code actuel utilise ce format png:

PNG Image

Et produit cette JPG:

JPG Image

C'est la fonction que j'utilise actuellement.L'arrière-plan pour les images de démo a été mis à bleu, ou un int 255.

public static void PNGToJPEGConvert(String PNGPath, String NewJPEGPath, int BackColor) throws IOException {
    try {
        BufferedImage bufferedImage = ImageIO.read(new File(PNGPath));
        BufferedImage newImage;
        int R1, G1, B1, R2 = (BackColor & 0xFF0000) >> 16, G2 = (BackColor & 0xFF00) >> 8, B2 = (BackColor & 0xFF), W1, W2, W3, M1, M2, R3, G3, B3;
        float br;
        newImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
        for(int x=0; x < bufferedImage.getWidth(); x++) {
            for(int y=0; y < bufferedImage.getHeight(); y++) {
                R1 = BufferedImageGetPixelARGB(bufferedImage, "R", x, y);
                G1 = BufferedImageGetPixelARGB(bufferedImage, "G", x, y);
                B1 = BufferedImageGetPixelARGB(bufferedImage, "B", x, y);
                W1 = Math.min(R1, Math.min(G1, B1));
                W2 = Math.min(R2, Math.min(G2, B2));
                R1 -= W1;
                G1 -= W1;
                B1 -= W1;
                R2 -= W2;
                G2 -= W2;
                M1 = Math.max(R1, Math.max(G1, B1));
                M2 = Math.max(R2, Math.max(G2, B2));
                br = (M1 + M2)/(2*BufferedImageGetPixelARGB(bufferedImage, "A", x, y));
                R3 = (int) ((R1 + R2) * br);
                G3 = (int) ((G1 + G2) * br);
                B3 = (int) ((B1 + B2) * br);
                W3 = (W1 + W2) / 2;
                R3 += W3;
                G3 += W3;
                B3 += W3;
                newImage.setRGB(x, y, RGBValuesToInt(R3, G3, B3));
            }
        }
        try {
            ImageIO.write(newImage, "jpg", new File(NewJPEGPath));
        } catch(Exception e) {

        }
    } catch(Exception e) {

    }
}

Merci pour l'aide, -Neil

Était-ce utile?

La solution

Fondamentalement, il est

float masking_factor = mask_value/255.0;
composed_value = int(
    source_pixel_value * (1 - masking_factor) + 
    overlay_pixel_value * masking_factor
);

Nous supposons que toutes les valeurs sont de 8 bits, qui est, de 0 à 255, et mask est monochrome.Où mask est complètement noir, il est totalement transparent, et la seule source de pixels sont visibles.Où mask tout en blanc, il est totalement opaque, et seulement superposition de pixels sont visibles.Les valeurs entre donner intermédiaire d'opacité.

Mais si l'alpha blending est l' seulement chose que vous voulez mettre en œuvre, il y a de meilleures façons de le faire que de travailler avec des pixels.Voir Graphics2D et son .setComposite() la méthode.

Autres conseils

public static Color mixColorsWithAlpha(Color color1, Color color2, int alpha)
{
    float factor = alpha / 255f;
    int red = (int) (color1.getRed() * (1 - factor) + color2.getRed() * factor);
    int green = (int) (color1.getGreen() * (1 - factor) + color2.getGreen() * factor);
    int blue = (int) (color1.getBlue() * (1 - factor) + color2.getBlue() * factor);
    return new Color(red, green, blue);
}

Ce serait la même chose que de peindre la couleur2 (avec la valeur alpha donnée) sur la couleur1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top