Bild mit transparenter Farbe

Jneu

Mitglied
Hallo,
ich bin gerade dabei die ersten Schritte mit Jawa zu machen und komme bei einem Problem nicht weiter. Ich habe ein Bild mit einer Transparenten Farbe. Beim anzeigen wird aber alles schwarz und das transparente bleibt weiss. Bei einem normalen Bild funktioniert das. Hier mein code und Ximage ist ein .png Bild:
Java:
startbild = im2java(Ximage);
fenster = javax.swing.JWindow
con = javax.swing.ImageIcon(startbild)
beschr = javax.swing.JLabel(con)
fenster.getContentPane.add(beschr)
fenster.setAlwaysOnTop(true);
fenster.pack;

fenster.show

könnt ihr mir da helfen?

Danke
 
Welches Format hat deine Image Datei ? Probiere doch einmal, dein Image als PNG-Datei zu speichern bzw. zu konvertieren und setze dein Bild mit einem Bildbearbeitungsprogramm transparent.

Oder probiere es, indem du die paint()-Methode überschreibst.

Java:
@Override
public void paintComponent(Graphics graph)
{
  Graphics2D g2d = (Graphics2D) graph;
  g2d.setComposite(AlphaComposite. getInstance(AlphaComposite.SRC_OVER, 0.75f));  // 0.75f evt. auf indivduellen Wert ändern.
 
  g2d.drawImage(new ImageIcon("Bildpfad").getImage(),0,0,getWidth(),getHeight());
}

MfG
 
Hallo und erst mal Danke,
mein Image hat die Endung .png (Bild.png) und es funktioniert auch solange ich das Bild (mit einem Bildbearbeitungsprogramm) nicht so ändere, dass ich eine Farbe lösche (transparent setze). Also das .png hat bereits die transparente Farbe. Das Bild.png ist ja nicht mein Problem. Nur beim aufrufen wird alles transparente schwarz. Noch dazu arbeite ich hier mit matlab und das macht die ganze Sache noch komplizierter.
 
Bist du denn auf das PNG-Format angewiesen? Die Transparenz in GIF-Dateien stellt für swing-Anwendungen und die ImageIO-Geschichten meiner Erfahrung nach keine Probleme dar. Es kann einfach sein (bzw. ist sogar wahrscheinlich), dass irgendeine Komponente, die du benutzt, mit einer PNG in der vorliegenden Form nicht umgehen kann (Stichwort Alpha-Kanal).
Ich meine ich glaube nicht, dass du was falsch machst - vielleicht findest du ja das schwache Glied und dann eine Alternative dazu. Oder probierst es mit GIF.

Viel Erfolg!
 
Danke,
na das probier ich gleich mal. Ob das png oder gif oder sonst was ist, ist egal.
Das mit dem Alpha-kanal hab ich auch schon gelesen, aber ich konnte es nicht lösen.
Ich habs jetzt mit .gif und .jpg und .png überprüft. Immer das gleiche. Es geht so nicht.
Irgendwie muss der Alphawert übergeben werden um die Pixel zu finden, die transparent werdn sollen.
Das hab ich gefunden, kann das aber wegen "Inkompetenz" nicht auf meine Zwecke umschreiben :autsch:
Java:
public BufferedImage convertPNG(String filePath,int newW, int newH){
        BufferedImage in = getImage(filePath);
        GraphicsConfiguration gc = in.createGraphics().getDeviceConfiguration();
        BufferedImage out = gc.createCompatibleImage(newW,newH, Transparency.BITMASK);
        Graphics2D g2d = out.createGraphics();
        g2d.setComposite(AlphaComposite.Src);
        g2d.drawImage(in, 0, 0,newW, newH, null);
        g2d.dispose();
        return out;
    }
 
Zuletzt bearbeitet:
Ja genau das. Wenn du meinen ersten Beitrag liest, dann müsste ich das nur noch irgendwie einbauen.
Aber wie??
Morgen kauf ich mir ein Java Buch für Dummies ;(
 
Kopiere mal diese Datei in das entpackte Verzeichnis und führe sie aus:
Java:
import java.awt.*;
import javax.swing.*;
import javax.imageio.*;

public class TransparentPicturePanel extends JPanel {
   private Image kaefer, landschaft;

   public TransparentPicturePanel() {
      super(new BorderLayout());
      try {
         kaefer = ImageIO.read(getClass().getResource("kaefer_freigestellt.gif"));
         landschaft = ImageIO.read(getClass().getResource("landschaft.jpg"));
      }
      catch(java.io.IOException ioe) {
         ioe.printStackTrace();
      }
      
      setPreferredSize(new Dimension(landschaft.getWidth(this), landschaft.getHeight(this)));
   }
   
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g;

      if(landschaft != null) {
         g.drawImage(landschaft, 0, 0, this);
      }

      g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); //Halbtransparenz für folgende Zeichenoperation(en)
      if(kaefer != null) {
         g.drawImage(kaefer, 0, 0, this);
      }
   }
   
   public static void main(String[] args) {
      JFrame frame = new JFrame("Bilder kombinieren");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(new TransparentPicturePanel());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }
}
Das wäre die Variante als Applikation. Hast du das gesucht?
 
Java:
         kaefer = ImageIO.read(getClass().getResource("kaefer_freigestellt.gif"));
         landschaft = ImageIO.read(getClass().getResource("landschaft.jpg"));

Da wunderts mich jetzt aber, dass das eine GIF-Datei sein soll. Denn die hat ja keinen Alpha-Kanal und somit keine Möglichkeit zur Halbtransparenz. Oder hab ich da was verpasst? Auf dem Bild da oben sieht mir das doch stark nach Halbtransparenz aus. Oder wurde da getrickst bei der GIF?
Sorry, ich könnte auch einfach in das Projekt gucken - aber mir ists jetzt zu spät...
 
Gif kann auch Transparenz speichern, allerdings nicht in einem klassischen Alphakanal.
Das Blatt mit dem Käfer wurde freigestellt, ein Teil des Bildes hat also transparente Pixel. Es wurde über das JPG-Bild gezeichnet.
Zusätzlich wurde das Gif-Bild auch noch mit Java-Methoden halbtransparent gemacht.
 

Zurück
Oben