2017-01-19 6 views
0

Ich habe 3 BufferedImages: A, C und D. Alle sind Bilder mit Farben und einem Alpha-Kanal. C hat D-over alpha, aber mit der Transparenz der Schicht A. Die Idee ist:BufferedImage Alpha von anderen BufferedImage setzen

  • den Alphakanal des C einstellen zu der eines
  • Alpha über sie

I Führen Sie das Alpha-Mischen mit new BufferedImage().createGraphics().drawImage(D).drawImage(C); durch. Aber wie stelle ich das Alpha von C ein?

Ich bin offen für alle Vorschläge mit BufferedImage, aber ich würde diejenigen vorziehen, die nicht über alle Pixel iterieren und die Berechnungen manuell durchführen, um die Leistung zu erhöhen (in der Hoffnung, es tut).

+0

Schauen Sie sich ähnliche Beiträge an, genau wie [diese] (http://stackoverflow.com/questions/660580/change-the-alpha-value-of-a-bufferedimage). –

Antwort

0

Für ein Bild mit einheitlichen alpha Sie folgendes tun: Jetzt hat

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 die Alpha-Version von b2.

Für ein Bild mit ungleichmäßigem Alpha muss Pixel pro Pixel bearbeitet werden.

+0

Was meinst du mit "uniform alpha"? Wenn es "Alpha ist überall gleich" ist, ist das nicht der Fall. – piegames

+0

ja dann Pixel für Pixel habe ich keine andere Wahl – gpasch