2017-01-19 36 views
0

我得到3 BufferedImages:A,C和D.所有是帶有顏色和alpha通道的圖像。 C具有α-超過d,但與A的透明性層的想法是:BufferedImage從其他BufferedImage設置alpha

  • 超過他們

我設置C的alpha通道是A

  • 阿爾法用new BufferedImage().createGraphics().drawImage(D).drawImage(C);做alpha混合。但是,我如何設置C的alpha?

    我打開任何建議使用BufferedImage,但我更喜歡那些不會遍歷所有像素,並手動進行計算,以提高性能(希望它)。

  • +0

    看看類似的帖子,就像[這一個](http://stackoverflow.com/questions/660580/change-the-alpha-value-of-a-bufferedimage)。 –

    回答

    0

    對於阿爾法均勻的圖像,你可以做到以下幾點:

    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

    「統一字母」是什麼意思?如果它「到處都是一樣的」,那就不是這樣了。 – piegames

    +0

    然後像素逐像素我沒有其他選擇 – gpasch