Gibt es eine Möglichkeit, eine Bitmap aus Datei in Android teilweise zu laden und zu zeichnen?

8

Angenommen, ich habe eine ziemlich große (d. h. nicht in die meisten Telefonspeicher passende) Bitmap auf der Festplatte. Ich möchte nur Teile davon auf dem Bildschirm in einer Weise zeichnen, die nicht skaliert ist (d. H.% Co_de%)

Gibt es eine Möglichkeit, nur den Teil zu laden / zu zeichnen, den ich möchte, wenn ein inSampleSize == 1 den Bereich spezifiziert, ohne den gesamten Bitmap-Inhalt zu laden?

    
chakrit 13.09.2010, 22:26
quelle

4 Antworten

9

Ich bin ziemlich zuversichtlich, dass dies möglich ist, da Sie eine wirklich große Bitmap-Datei problemlos in ein ImageView laden können, also muss es eine Art eingebauter Möglichkeit geben, große Bitmaps zu verarbeiten ... und nach ein paar Versuche, ich habe eine Lösung gefunden:

Anstatt die gesamte Bitmap zu laden und sie manuell selbst zu zeichnen, laden Sie sie stattdessen als Drawable :

%Vor%

Ich verwende eine Ressourcendatei, aber da Sie Drawable.createFromStream verwenden können, um ein Bild von einem beliebigen InputStream zu laden, sollte es mit einer beliebigen Bitmap arbeiten.

Verwenden Sie dann die Methode Drawable.draw , um sie wie folgt auf die gewünschte Leinwand zu zeichnen:

%Vor%

Wie im obigen Fall können Sie auch die Bitmap skalieren und übersetzen, indem Sie die Grenzen des Zeichnbaren manipulieren, und nur die relevanten Teile der Bitmap werden in Canvas geladen und gezeichnet.

Das Ergebnis ist eine Pinch-Zoom-Ansicht aus nur einer einzigen 200-KB-Bitmap-Datei. Ich habe das auch mit einer 22MB PNG-Datei getestet und es funktioniert immer noch ohne OutOfMemoryError , auch wenn sich die Bildschirmausrichtung ändert.

    
chakrit 13.09.2010, 23:34
quelle
4

Jetzt ist es sehr relevant: BitmapRegionDecoder .

Hinweis: verfügbar seit Android SDK 10

    
Vadim 11.10.2012 21:49
quelle
3

Es kann einfach mit RapidDecoder durchgeführt werden.

%Vor%

Es unterstützt bis Android 2.2 (API Level 8).

    
suckgamony 05.01.2014 08:31
quelle
1

Im Allgemeinen ist das nicht möglich, besonders da die meisten Bildformate komprimiert sind, so dass Sie nicht einmal wissen, welche Bytes gelesen werden sollen, bis Sie das unkomprimierte Formular extrahiert haben.

Brechen Sie Ihr Bild in kleine Kacheln auf und laden Sie nur die Kacheln, die Sie zum Abdecken der Region benötigen, die Sie zur Laufzeit anzeigen möchten. Um ein unruhiges Scrollen zu vermeiden, möchten Sie möglicherweise auch Kacheln, die gerade nicht sichtbar sind (diejenigen, die die sichtbaren Kacheln begrenzen), in einem Hintergrund-Thread vorab laden.

    
Marcelo Cantos 13.09.2010 22:31
quelle

Tags und Links