Java 将2种RGB颜色与Alpha组合
我尝试(在Java中)在组合两种颜色时获得结果颜色,顶部的一种具有alpha透明度。基本上,我试图为图像指定背景色,但我已经将其分解为每个单独更改的像素。我看过好几篇文章,包括,但都没有用。有人知道如何进行这种RGBA/RGB颜色混合吗?我当前的代码使用以下png: 并生成此JPG: 这是我目前正在使用的函数。演示图像的背景设置为全蓝色,或255的整数Java 将2种RGB颜色与Alpha组合,java,colors,rgb,bufferedimage,rgba,Java,Colors,Rgb,Bufferedimage,Rgba,我尝试(在Java中)在组合两种颜色时获得结果颜色,顶部的一种具有alpha透明度。基本上,我试图为图像指定背景色,但我已经将其分解为每个单独更改的像素。我看过好几篇文章,包括,但都没有用。有人知道如何进行这种RGBA/RGB颜色混合吗?我当前的代码使用以下png: 并生成此JPG: 这是我目前正在使用的函数。演示图像的背景设置为全蓝色,或255的整数 public static void PNGToJPEGConvert(String PNGPath, String NewJPEGPath
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) {
}
}
public static void PNGToJPEGConvert(字符串PNGPath、字符串NewJPEGPath、int BackColor)引发IOException{
试一试{
buffereImage buffereImage=ImageIO.read(新文件(PNGPath));
缓冲图像新图像;
int R1,G1,B1,R2=(背景色和0xFF0000)>>16,G2=(背景色和0xFF00)>>8,B2=(背景色和0xFF),W1,W2,W3,M1,M2,R3,G3,B3;
浮动br;
newImage=new BufferedImage(BufferedImage.getWidth(),BufferedImage.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);
对于(int x=0;x
谢谢你的帮助,
-尼尔基本上是这样
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
是单色的。当遮罩
是完全黑色时,它是完全透明的,并且只有源像素可见。当遮罩
为完全白色时,它是完全不透明的,并且只有重叠像素可见。介于两者之间的值提供中间不透明度
但是,如果alpha混合是您想要实现的唯一东西,那么有比处理单个像素更好的方法。请参阅及其.setComposite()
方法
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(具有给定的alpha值)相同。这帮助我将颜色与黑色混合,以获得更暗的颜色。谢谢