首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedImage集α来自其他BufferedImage

BufferedImage集α来自其他BufferedImage
EN

Stack Overflow用户
提问于 2017-01-19 10:07:06
回答 1查看 391关注 0票数 0

我得到了3 BufferedImages: A,C和D,它们都是带有颜色和alpha通道的图像。C必须是α-over D,但是对于A的透明层,其想法是:

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

我用new BufferedImage().createGraphics().drawImage(D).drawImage(C);做α混合。但是如何设置C的阿尔法呢?

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

EN

回答 1

Stack Overflow用户

发布于 2017-01-20 00:22:55

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

代码语言:javascript
复制
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。

对于带有非均匀阿尔法的图像,你必须在每个像素上工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41738990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档