API-Referenz: Codec (Dekodierung & Animation)
Während Image.makeDeferredFromEncodedBytes() für einfache statische Bilder ausreicht, benötigen Sie die Codec-Klasse, wenn Sie mehr Kontrolle über den Dekodierungsprozess benötigen oder mit animierten Bildern (GIF, animiertes WebP) arbeiten.
Laden eines Codec
Ein Codec repräsentiert die "Quelle" eines Bildes, bevor es in Pixel umgewandelt wird.
Data data = Data.makeFromFileName("animations/loading.gif");
Codec codec = Codec.makeFromData(data);Grundlegende Dekodierung
Um einen einzelnen statischen Frame aus einem Codec zu erhalten:
Bitmap bmp = new Bitmap();
bmp.allocPixels(codec.getImageInfo()); // Speicher vorbereiten
codec.readPixels(bmp); // Die Daten in die Bitmap dekodierenUmgang mit Animationen
Hier zeigt Codec seine Stärken. Es ermöglicht Ihnen, durch die Frames eines GIF oder WebP zu iterieren.
int frameCount = codec.getFrameCount();
int loopCount = codec.getRepetitionCount(); // -1 für unendlich
for (int i = 0; i < frameCount; i++) {
// 1. Informationen über diesen spezifischen Frame abrufen (Dauer, etc.)
AnimationFrameInfo info = codec.getFrameInfo(i);
int duration = info.getDuration(); // in Millisekunden
// 2. Den Frame dekodieren
Bitmap frameBmp = new Bitmap();
frameBmp.allocPixels(codec.getImageInfo());
codec.readPixels(frameBmp, i);
// 3. Etwas mit dem Frame machen...
}Erweiterte Dekodierungsoptionen
Skalierung während der Dekodierung
Wenn Sie ein 4K-Bild haben, es aber nur in 200x200 benötigen, können Sie dem Codec anweisen, es während des Dekodierungsprozesses zu skalieren. Dies ist viel schneller und benötigt deutlich weniger Speicher, als das volle Bild zu dekodieren und es dann zu skalieren.
ImageInfo smallInfo = ImageInfo.makeN32Premul(200, 200);
Bitmap smallBmp = new Bitmap();
smallBmp.allocPixels(smallInfo);
codec.readPixels(smallBmp); // Dekodiert und skaliert in einem Schritt!Wichtige Hinweise
- Stream-Rückspulen: Einige Codecs (abhängig von den Quelldaten) können nicht zurückgespult werden. Wenn Sie Frames mehrfach dekodieren müssen, ist es sicherer, die
Dataim Speicher zu behalten. - Farbräume: Der Codec versucht, den im Bild eingebetteten Farbraum zu berücksichtigen. Sie können dies überschreiben, indem Sie
readPixelseine andereImageInfobereitstellen. - Speicher: Der
Codecselbst ist klein, aber dieBitmap-Objekte, in die Sie dekodieren, können sehr groß sein. Wiederverwenden Sie Bitmaps, wo möglich.