Skip to content

images (Bilder)

Import

Das statische Attribut images der Klasse Controller kann über einen statischen Import eingebunden werden:

import static pi.Controller.images;

Bilder laden

Über das statische Attribut Controller.images bzw. den statischen Import import staticpi.Controller.images; werden Bilder als BufferedImage geladen.

import static pi.Controller.images;
import java.awt.image.BufferedImage;

BufferedImage moon = images.get("moon.png");

Der übergebene Name ist ein Ressourcenpfad relativ zum Ressourcenordner.

Die Klasse BufferedImage

BufferedImage ist die Standardklasse in Java für Bilder im Speicher. Sie enthält die Pixel eines Bildes und ermöglicht es, Breite, Höhe und Farbwerte direkt auszulesen oder zu verarbeiten. In Engine Pi liefert der ImageContainer Bilder genau in diesem Format, damit sie direkt in der Figur bzw. im Actor Image verwendet werden können.

Pixel vervielfältigen

Pixelgrafiken lassen sich beim Laden mit Hilfe der Methode get(String, int) mit einem Vergrößerungsfaktor abrufen. Dabei wird jeder Pixel als Block vervielfacht.

import static pi.Controller.images;
import java.awt.image.BufferedImage;

BufferedImage normal = images.get("box.png");
BufferedImage x2 = images.get("box.png", 2);
BufferedImage x3 = images.get("box.png", 3);

Zusätzlich kann global in der Konfiguration GraphicsConfig#pixelMultiplication() gesetzt werden.

Farben in Bildern ersetzen

Die Methode get(String, Color[], Color[]) unterstützt das Ersetzen von Farben direkt beim Abruf.

import static pi.Controller.images;
import java.awt.Color;
import java.awt.image.BufferedImage;

Color[] from = { Color.BLUE };
Color[] to = { Color.RED };

BufferedImage recolored = images.get("box.png", from, to);
BufferedImage recoloredScaled = images.get(
    "box.png",
    2,
    from,
    to
);

Bild als Figur verwenden

Die vom ImageContainer geladenen Bilder als BufferedImage können in der Figur bzw. dem Actor Image entweder über den Konstruktor Image#Image(BufferedImage) oder die Setter-Methode Image#image(BufferedImage) verwendet werden.

import static pi.Controller.images;
import pi.Controller;
import pi.Scene;
import pi.actor.Image;
import java.awt.image.BufferedImage;

public class MyScene extends Scene
{
    public MyScene()
    {
        BufferedImage dude = images.get("dude.png")
        Image actor = new Image(dude)
            .pixelPerMeter(30)
            .center(0, 0);
        add(actor);
    }

    public static void main(String[] args)
    {
        Controller.instantMode(false);
        Controller.start(new MyScene());
    }
}

Caching und Performance

Der Bildcontainer speichert geladene Bilder intern. Mehrfaches images.get("...") mit demselben Namen liefert typischerweise dieselbe Instanz aus dem Cache. Dadurch werden Dateizugriffe reduziert und Ladezeiten verbessert.

Bei Bedarf kann der Container geleert werden:

import static pi.Controller.images;

images.clear();