Image soll langsam sichtbar werden

Degush

Aktives Mitglied
Hey,

ich möchte ein Programm schreiben, das für Präsentationen geeignet ist. Sowas wie Powerpoint zum Beispiel (aber an meine Zwecke angepasst).
Dafür möchte ich ein Bild langsam sichtbar werden lassen. Der Alphawert jedes Pixels soll also innerhalb einer bestimmten Zeit von 255 auf den Bildalphawert des Pixels sinken.
Um vielleicht auch einmal anderen Nutzen daraus zu ziehen, möchte ich das ganze möglichst allgemein halten - ich dachte an ein Farbfilterinterface oder so etwas.

Meine Frage: Kann ich anstatt jeden Pixel des Bildes einzeln neu zu berechnen und zu speichern (das sollte dann wohl kaum noch flüssig laufen), einfach ein anderes Bild auf das BufferedImage zeichnen, das Rot-, Grün- und Blauwerte von 255 und einen Alphawert von 0 hat, bei dem ich den Alphawert langsam von 0 langsam auf 255 erhöhe und nach jeder Erhöhung das ursprüngliche Bild neu und darüber das "Fading-Image" zeichne?

MfG,
Malte
 
Du kannst dir ein [JAPI]Graphics2D [/JAPI] Objekt vom [JAPI]BufferedImage[/JAPI] holen und mit Hilfe von [JAPI]AlphaComposite [/JAPI] auf ein neues [JAPI]BufferedImage [/JAPI] zeichnet um so den Alpha Wert zu setzen.

Java:
float alpha = 0.5f;
AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.CLEAR,alpha );

BufferedImage src = ...;
BufferedImage image = new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);

Graphics2D g2 = image.createGraphics();
g2.setComposite(ac);
g2.drawImage(src, null, 0, 0);
g2.dispose();

[EDIT]
Oder direkt mit Hilfe der
Java:
public void paintComponent(Graphics g){
   Graphics2D g2 = (Graphics2D) g;
   // ...
}
auf eine [JAPI]JComponent [/JAPI] Zeichnen.


[/EDIT]
 
Zuletzt bearbeitet:
Hmm, klappt leider nicht:

Java:
.....
g2d = paintOn.createGraphics();
        g2d.setColor( new Color(255,255,255) );
        g2d.fillRect( 0, 0,  size.getWidth(), size.getHeight() );
        Graphics graphics = null;
        
        for(int i = 0; i < count; i++)
        {
            Paintable p = objects[i];
            if (
                    p.xPosition+p.getBoundingBox().getWidth() > offset.x*scale &&
                    p.xPosition < offset.x*scale+size.getWidth() &&
                    p.yPosition < offset.y*scale+size.getHeight() &&
                    p.yPosition+p.getBoundingBox().getHeight() > offset.y*scale )
            {
                //if ( log.isActivated() )
                //    log.log("Rendering "+p.getIdentityName());
                p.setPaintedInUniverse(true);
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, p.alpha));
                g2d.drawImage(p.getGraphics(), (int)(p.xPosition-offset.x), (int)(p.yPosition-offset.y), null);
            } else
            {
                //if ( log.isActivated() )
                    //log.log("       NOT Rendering "+p.getIdentityName()+": Bounds out of world");
                p.setPaintedInUniverse(false);
            }
        }
        
        graphics = buffer.getDrawGraphics();
.....

AlphaComposite.SRC hat keine Wirkung, AlphaComposite.CLEAR macht alles schwarz

edit:
Die ImageTypen sind alle BufferedImage.TYPE_INT_ARGB
Ich brauche sie Grafikkartenbeschleunigt.

edit 2:
Funktioniert mit AlphaComposite.SRC_OVER
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben