2017-11-29 4 views
0

Ich zeichne Grafiken im Rahmen mit dieser Methode.Möglichkeit, die Transparenz mit Java Swing zu ändern.image

public void paint(Graphics g) { 
    screenImage = createImage(1280, 720); 
    screenGraphic = screenImage.getGraphics(); 
    screenDraw((Graphics2D) screenGraphic); 
    //g.drawImage(BG, 0, 0, null); 
    g.drawImage(screenImage, 0, 0, null); 
} 

public void screenDraw(Graphics2D g) { 
    g.drawImage(BG, 0, 0, null); 
    Graphics2D g2 = (Graphics2D)g; 
    if(isMainScreen) { 
     //g2.setComposite(alphaComposite); 
     g2.drawImage(selectedImage, 100, 220, null); 
    } 
    paintComponents(g); 
    this.repaint(); 
} 

Ich möchte selectedImage als Transparenz 50% oder andere Ganzzahl haben.

private Image selectedImage = new ImageIcon(Main.class.getResource("../pic/something.jpg")).getImage(); 

dies ist selectedImage, und es funktioniert gut.

Antwort

1

Passen Sie ein bisschen Image -> BufferedImage Code, und dann können Sie jedes Pixel auf

Image selectedImage = new ImageIcon([...]).getImage(); 

//Image -> BufferedImage code 
BufferedImage img = new BufferedImage(selectedImage.getWidth(null), selectedImage.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
Graphics2D g = img.createGraphics(); 
g.drawImage(selectedImage, 0, 0, null); 
g.dispose(); 

//set each pixel to be transparent 
int transparency = 127; //0-255, 0 is invisible, 255 is opaque 
int colorMask = 0x00FFFFFF; //AARRGGBB 
int alphaShift = 24; 
for(int y = 0; y < img.getHeight(); y++) 
    for(int x = 0; x < img.getWidth(); x++) 
     img.setRGB(x, y, (img.getRGB(x, y) & colorMask) | (transparency << alphaShift)); 

//img is now transparent, can replace selectedImage if you want (optional) 
selectedImage = img; 

transparent sein, wenn Sie ImageIO.read(File) statt ImageIcon.getImage() verwenden, wird es geben Ihnen einen BufferedImage direkt

+0

ändern 'Graphics2D g = img.createGraphics(); g.drawImage (selectedImage, 0, 0, null); 'zu' Graphics2D g = img.createGraphics(); Zusammengesetztes c = AlphaComposite.getInstance ( AlphaComposite.SRC_ATOP, .5f); g.setComposite (c); g.drawImage (selectedImage, 0, 0, null); 'und der Job ist erledigt! –

+0

@AndrewThompson Ordentlich, ich war sicher, es gab eine Möglichkeit, die Zeichnung zu ändern, war aber nicht sicher, was zu verwenden ist. Wenn ich mich richtig erinnere, ist 'JFrame.paint (Graphics)' eigentlich ein 'Graphics2D'-Objekt, auf das das Composite temporär angewendet werden könnte? – phflack

+0

Ja, solange die 'Graphics' in ein' Graphics2D' Objekt umgewandelt oder auf andere Weise erzeugt werden. Aber ändern Sie nicht die Malmethoden von Top-Level-Containern. Mache eine benutzerdefinierte Malerei in einem 'JPanel', –