Java BuffereImage从其他BuffereImage设置alpha

Java BuffereImage从其他BuffereImage设置alpha,java,bufferedimage,alpha,alphablending,Java,Bufferedimage,Alpha,Alphablending,我得到了3个缓冲区图像:A、C和D。所有图像都带有颜色和alpha通道。C必须是alpha/D,但透明层为A。其想法是: 将C的alpha通道设置为A的alpha通道 阿尔法在他们上面 我使用newbufferedimage().createGraphics().drawImage(D)和drawImage(C)进行alpha混合。但是如何设置C的alpha呢 我愿意接受任何使用BuffereImage的建议,但我更喜欢那些不迭代所有像素并手动进行计算以提高性能的图像(希望如此)。对于具有统

我得到了3个缓冲区图像:A、C和D。所有图像都带有颜色和alpha通道。C必须是alpha/D,但透明层为A。其想法是:

  • 将C的alpha通道设置为A的alpha通道
  • 阿尔法在他们上面
我使用
newbufferedimage().createGraphics().drawImage(D)和drawImage(C)进行alpha混合。但是如何设置C的alpha呢


我愿意接受任何使用BuffereImage的建议,但我更喜欢那些不迭代所有像素并手动进行计算以提高性能的图像(希望如此)。

对于具有统一alpha的图像,您可以执行以下操作:

BufferedImage bim=null;
try {
  bim=ImageIO.read(new File("..."));
}
catch (Exception ex) { System.err.println("error in bim "+ex); }
int wc=bim.getWidth(), hc=bim.getHeight();
  BufferedImage b=new BufferedImage(wc, hc, BufferedImage.TYPE_INT_ARGB);
  b.getGraphics().drawImage(bim, 0, 0, null);
  BufferedImage b2=new BufferedImage(wc, hc, BufferedImage.TYPE_INT_ARGB);
  RescaleOp no=new RescaleOp(new float[]{1f, 1, 1, 1f}, new float[]{0, 0, 0, -50}, null);
  b2=no.filter(b, null);

  BufferedImage b3=new BufferedImage(wc, hc, BufferedImage.TYPE_INT_ARGB);
  b3.getGraphics().drawImage(bim, 0, 0, null);
  float offset=(b2.getRGB(0, 0)&0xff000000)>>24, a=(b3.getRGB(0, 0)&0xff000000)>>24;
  no=new RescaleOp(new float[]{1, 1, 1, 1}, new float[]{0, 0, 0, -a+offset}, null);
  b3=no.filter(b3, null);
现在b3有b2的α


对于具有非均匀alpha的图像,您必须按像素计算。

看看类似的帖子,就像。您说的“均匀alpha”是什么意思?如果是“阿尔法在任何地方都是一样的”,那就不是这样了。是的,那么逐像素我别无选择