3

私は(Javaで)2つの色を組み合わせたときに結果の色を取得しようとしています.1つはアルファ透明度です。基本的に、画像に背景色を割り当てようとしていますが、個別に変更される各ピクセルに分解しました。これを含むいくつかの記事を見ましたが、役に立ちませんでした。この種の RGBA/RGB カラーミキシングを実行する方法を知っている人はいますか? 私の現在のコードはこのpngを使用しています:

PNG画像

そして、このJPGを生成します:

JPG画像

これは私が現在使用している機能です。デモ画像の背景は完全な青、つまり 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) {

    }
}

助けてくれてありがとう - ニール

4

2 に答える 2

6
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);
}

これは、color1 の上に (指定されたアルファ値を持つ) color2 をペイントすることと同じです。

于 2014-04-10T14:26:13.087 に答える
2

基本的には

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

値はすべて 8 ビット、つまり 0 ~ 255 であり、maskモノクロであるとします。maskは完全に黒く、完全に透明で、ソース ピクセルのみが表示されます。maskは完全に白く、完全に不透明で、オーバーレイ ピクセルのみが表示されます。中間の値は、中間の不透明度を提供します。

ただし、アルファ ブレンディングだけを実装する場合は、個々のピクセルを操作するよりも優れた方法があります。Graphics2Dとその.setComposite()方法を参照してください。

于 2011-12-07T03:30:10.160 に答える