BufferedImage从其他BufferedImage设置alpha

时间:2017-01-19 10:07:07

标签: java bufferedimage alpha alphablending

我有3个BufferedImages:A,C和D.所有图像都带有颜色和alpha通道。 C必须使用alpha-over D,但使用A的透明层。这个想法是:

  • 将C的Alpha通道设置为A
  • 的Alpha通道
  • 阿尔法在他们身上

我使用new BufferedImage().createGraphics().drawImage(D).drawImage(C);进行alpha混音。但是如何设置C的alpha?

我对使用BufferedImage的任何建议持开放态度,但我更喜欢那些不迭代所有像素并手动进行计算以提高性能的建议(希望它能够实现)。

1 个答案:

答案 0 :(得分:0)

对于具有统一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的alpha值为b2。

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