Ich lade eine Bitmap in eine ImageView und sehe diesen Fehler. Ich nehme an, diese Beschränkung bezieht sich auf eine Größenbeschränkung für OpenGL-Hardwaretexturen (2048 x 2048). Das Bild, das ich laden muss, ist ein Pinch-Zoom-Bild mit einer Höhe von etwa 4.000 Pixel.
Ich habe versucht, die Hardwarebeschleunigung im Manifest auszuschalten, aber keine Freude.
<application
android:hardwareAccelerated="false"
....
>
Ist es möglich, ein Bild mit mehr als 2048 Pixel in eine ImageView zu laden?
inSampleSize
Ansatz.Antworten:
Das gesamte Rendering basiert auf OpenGL. Nein, Sie können dieses Limit nicht überschreiten (
GL_MAX_TEXTURE_SIZE
abhängig vom Gerät, aber das Minimum ist 2048 x 2048, sodass alle Bilder unter 2048 x 2048 passen).Wenn Sie bei so großen Bildern verkleinern und ein Mobiltelefon verwenden möchten, sollten Sie ein System einrichten, das dem ähnelt, das Sie beispielsweise in Google Maps sehen. Mit dem Bild in mehrere Teile und mehrere Definitionen aufgeteilt.
Sie können das Bild auch verkleinern, bevor Sie es anzeigen (siehe Antwort von user1352407) von auf diese Frage).
Achten Sie auch darauf, in welchen Ordner Sie das Bild legen. Android kann Bilder automatisch skalieren. Schauen Sie sich die Antwort von Pilot_51 auf diese Frage an.
quelle
Dies ist keine direkte Antwort auf die Frage (Laden von Bildern> 2048), sondern eine mögliche Lösung für alle, bei denen der Fehler auftritt.
In meinem Fall war das Bild in beiden Dimensionen kleiner als 2048 (um genau zu sein 1280 x 727), und das Problem trat speziell bei einem Galaxy Nexus auf. Das Bild befand sich im
drawable
Ordner und in keinem der qualifizierten Ordner. Android geht davon aus, dass Drawables ohne Dichtequalifizierer mdpi sind, und skaliert sie für andere Dichten nach oben oder unten, in diesem Fall 2x für xhdpi.drawable-nodpi
Das Problem wurde behoben, indem das Bild des Täters verschoben wurde, um eine Skalierung zu verhindern.quelle
drawable
Wesentlichen einen verstecktendrawable-mdpi
Ordner zu machen . Dies erklärte auch, warum meine benutzerdefinierten Kartenmarkierungen schrecklich aussahen (sie wurden hochskaliert und dann verkleinert).Ich habe das Bild folgendermaßen verkleinert:
quelle
ctx
bedeutet das?Anstatt stundenlang zu versuchen, diesen gesamten Downsampling-Code manuell zu schreiben / zu debuggen, sollten Sie ihn verwenden
Picasso
. Es wurde für den Umgang mit gemachtbitmaps
allen Arten und / oder Größen gemacht.Ich habe diese einzelne Codezeile verwendet, um mein Problem "Bitmap zu groß ..." zu entfernen :
quelle
Das Hinzufügen der folgenden 2 Attribute in (
AndroidManifest.xml
) hat bei mir funktioniert:quelle
Das Ändern der Bilddatei in einen
drawable-nodpi
Ordner vondrawable
Ordner zu Ordner hat bei mir funktioniert.quelle
drawable
Ordner automatisch zu skalieren .Ich habe Picasso benutzt und hatte das gleiche Problem. Das Bild war zumindest in Bezug auf Größe, Breite oder Höhe zu groß. Endlich habe ich hier die Lösung gefunden. Sie können das große Bild entsprechend der Anzeigegröße verkleinern und das Seitenverhältnis beibehalten:
und verwenden Sie diese Methode zum Laden des Bildes von Picasso:
Für eine bessere Leistung können Sie das Bild auch nach Breite und Höhe des Bildschirms herunterladen, nicht nach dem gesamten Bild:
und dann:
BEARBEITEN: getDisplaySize ()
display.getWidth()/getHeight()
ist veraltet. Anstelle vonDisplay
GebrauchDisplayMetrics
.quelle
BitmapRegionDecoder
macht den Trick.Sie können überschreiben
onDraw(Canvas canvas)
, einen neuen Thread starten und den für den Benutzer sichtbaren Bereich dekodieren.quelle
Wie von Larcho ausgeführt, können Sie ab API-Ebene 10
BitmapRegionDecoder
bestimmte Regionen aus einem Bild laden und so ein großes Bild in hoher Auflösung anzeigen, indem Sie nur die benötigten Regionen im Speicher zuweisen. Ich habe kürzlich eine Bibliothek entwickelt, die die Visualisierung großer Bilder mit Touch-Gesten-Handhabung ermöglicht. Der Quellcode und Beispiele finden Sie hier .quelle
Ansichtsebene
Sie können die Hardwarebeschleunigung für eine einzelne Ansicht zur Laufzeit mit dem folgenden Code deaktivieren:
myView.setLayerType (View.LAYER_TYPE_SOFTWARE, null);
quelle
Ich habe das gleiche Problem durchlaufen, hier ist meine Lösung. Stellen Sie die Breite des Bildes auf die Breite des Android-Bildschirms ein und skalieren Sie dann die Höhe
Dies ist besser für jede Größe Android-Bildschirm. Lassen Sie mich wissen, ob es für Sie funktioniert.
quelle
Bild verkleinern:
Das Bild wird auf die Größe von reqHeight und reqWidth verkleinert. Soweit ich weiß, nimmt inSampleSize nur eine Potenz von 2 Werten auf.
quelle
Verwenden Sie die Glide-Bibliothek, anstatt sie direkt in die Bildansicht zu laden
Gleiten: https://github.com/bumptech/glide
quelle
Ich habe alle oben genannten Lösungen viele Stunden lang nacheinander ausprobiert, und keine schien zu funktionieren! Schließlich habe ich mich nach einem offiziellen Beispiel umgesehen, um Bilder mit der Android-Kamera aufzunehmen und anzuzeigen. Das offizielle Beispiel ( hier ) gab mir endlich die einzige Methode, die funktionierte. Unten präsentiere ich die Lösung, die ich in dieser Beispiel-App gefunden habe:
quelle
HINWEIS FÜR DIE, DIE BILDER VON KLEINER GRÖSSE EINSTELLEN MÖCHTEN:
Die Lösung von Pilot_51 (Verschieben Ihrer Bilder in einen
drawable-nodpi
Ordner) funktioniert, hat jedoch ein weiteres Problem: Sie macht Bilder ZU KLEIN auf dem Bildschirm , wenn nicht die Bilder , die auf eine sehr große Größe verändert werden (wie 2000 x 3800) Auflösung fit Bildschirm - dann macht es Ihre Anwendung schwerer .LÖSUNG : Legen
drawable-hdpi
Sie Ihre Bilddateien ein - Es hat wie ein Zauber für mich funktioniert.quelle
Die Verwendung des richtigen zeichnbaren Unterordners hat es für mich gelöst. Meine Lösung bestand darin, mein Bild in voller Auflösung (1920 x 1200) in den Ordner drawable-xhdpi anstatt in den Ordner drawable zu legen .
Ich habe auch ein verkleinertes Bild (1280x800) in den Ordner drawable-hdpi gelegt .
Diese beiden Auflösungen stimmen mit den von mir programmierten Nexus 7-Tablets 2013 und 2012 überein. Ich habe die Lösung auch auf einigen anderen Tabletten getestet.
quelle
Dieser Code ist Arbeit
quelle