Wie Sie wissen, eine Bitmap der Größe von InputStream vor dem erstellen der Bitmap?
Ich den Maßstab des Bildes vor dem erstellen von es und ich will es nur tun, wenn es mehr als 1024KB (zum Beispiel).
Indem Sie den folgenden tun ich kann das Bild skalieren, aber ich habe nur skalieren müssen diejenigen, die größer sind als die angegebene Größe.
Bitmap bmImg = null;
InputStream is = url.openStream();
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 10;
bmImg = BitmapFactory.decodeStream(is,null,opts);
Wie kann ich die Größe der Bitmap? (Ich bin froh, zu wissen, die Menge der bytes an, nicht die Größe nach dem entpacken).
Edit:
Ich versuche dieses:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
Bitmap bmImg=BitmapFactory.decodeStream(is,null,opts);
Log.e("optwidth",opts.outWidth+"");
Bitmap bmImg1 = BitmapFactory.decodeStream(is);
Das erste mal, dass ich den InputStream (wird) zu decodieren, die es mit der "inJustDecodeBounds" funktioniert gut und ich kann die Bitmap-Abmessungen.
Das problem ist, dass das zweite mal, dass ich es tatsächlich entschlüsseln das Bild, es wird kein Bild angezeigt.
Was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin ein noob, so dass ich kann nicht kommentieren, monkjack Antwort direkt. Der Grund, seine Antwort ist so langsam ist, dass es kopiert ein byte zu einem Zeitpunkt. Mit einem Puffer von noch 1K wird deutlich verbessern die Leistung.
Wenn Sie wissen, das format der Datei, die Sie vielleicht in der Lage sein zu Lesen der header der Datei. Seinen gewöhnlichen den header enthält, der Größe und dem format des Bildes. Und zum Glück für Sie, das ist immer das erste Byte der Datei.
Könnte es nicht möglich sein, für bestimmte Arten.
PNG, JPEG, BMP, TGA
Gerade gelesen über den header und einige Datei, die Sie möglicherweise haben, zu erraten, wird die Breite zuerst. Für exemple, die PNG-Datei scheint nicht zu beinhalten, Breite/Höhe, aber Sie sollten in der Lage sein zu Lesen, die Breite und die Vermutung einer Höhe mit der pixel-Größe /Verhältnis.
Edit: My bad, ich dachte Sie wollte Skalierung mit der dimension... Ja ContentLenght sollte helfen, aber manchmal ist es 0 zurück, wenn der server nicht die richtige dimension im http-header. In diesem Fall müssen Sie wissen, die zurückgegebene Größe. Aber wie auch immer, können Sie ein bytearray und sobald alles geladen ist, überprüfen Sie einfach die Länge des Arrays. wenn es größer als 1024kb ist dann das Bild verkleinern. Und speichern Sie es, oder tun, was Sie will.
Können Sie wickeln
is
mit einemnew BufferedInputStream(is);
und verwenden Sie diemark(int readlimit)
undreset()
Methoden zu re-Lesen Sie den stream. Sie müssen entscheiden, was Siereadlimit
um es zu ermöglichen, Lesen Sie die gesamte Kopfzeile, die links von Loïc sollte hier helfen.Ich habe Links eine geeignete Fehlerbehandlung für die
reset()
Methode, wird es werfen eineIOException
wenn Sie gelesen haben, mehr alsreadlimit
bytes aus dem stream.Wenn Ihr versuchen zu verhindern, dass OutOfMemory oder etwas anderes...
können Sie erstellen Sie einen Puffer mit Ihre Bild-Daten,
Dann können Sie die Größe mit Puffer.outHeight, Puffer.outWidth..
Wenn Sie skalieren möchten, verwenden Sie einfach den Puffer.isSampleSize, aber ich bemerkte, du bist Einstellung gibt es eine "10" Wert... was ich denke ist falsch... sampleSize sollte eine 2^ Wert .. wie 2,4,8,16 usw.
Schließlich, nachdem Sie sind sampleSize Einstellung, können Sie das bitmap wie immer.
hoffe Euch zu helfen!
PS: SQS MEIN ENGLISCH IST =(!!!
Können Sie nicht die Größe von einem Strom von Ihrer definition. Wenn Sie möchten, könnten Sie laden den stream in ein byte-array Holen Sie sich die byte-Anzahl aus, die. Sie können auch mit der BitmapFactory zu Dekodieren, die ein byte-array direkt, also wäre das ganz schön.
Meisten streams sind verbraucht, wenn Sie aus Ihnen Lesen. In deinem 2. Codeblock, Sie konsumieren den stream das erste mal als bitmap. Beim aufrufen decodeString ein zweites mal, wird der stream leer ist (wenn auch nur in dem Sinne, dass alle Daten, die bereits gelesen wurden).
Die beste Antwort wird wahrscheinlich sein monkjack ist, aber vielleicht mit nur ein wenig zusätzlichen code, um sicherzustellen, dass Sie nicht Lesen eine gigantische Datei in den Speicher. Ich empfehle, nur ein check, wie du bist-streaming in einen Puffer für die Größe (d.h. stop-10MB), ich bin nicht sicher, wie gut Android wird der Umgang mit einer out of memory exception.
Wenn Sie die Drosselung zu verhindern
OutOfMemoryException
wie mich, ist diese Lösung besser für Sie (aufbauend auf Antworten hier):Vermied ich die Verwendung von
mark(int)
undreset()
da in meinem Fall gibt es keine Obergrenze für die Größe des Streams. So wie Sie zum zurücksetzen der stream hängt von Ihrer Umsetzung. Mein stream wurde angegeben, eineUri
, so dass ich nur verwendet:zurücksetzen der stream.
Überprüfen, logcat, wenn Sie einen Fehler, der sagt
"Bitmap too large to be uploaded into a texture"
dann müssen Sie das folgende zu tun. Meine Antwort ist ähnlich wie @Sergio A. Sie kann aber BitmapFactory.decodeStream, sondern direkt decodeByteArray.Diese erhalten nur die Größe des Bildes (nicht das ganze Bild an sich). Sie können isolieren Sie die Breite und Höhe mit dem folgenden code.
Können Sie verwenden Sie diese Werte (zusammen mit dem von Ihnen gewünschten Breite und Höhe - wahrscheinlich auf der Grundlage der Bildansicht oder den Bildschirm) zu berechnen
options.inSampleSize
. Ich werde mich nicht zu gehen in, wie zu tun, aber Google geliefert hat, ein tutorial hier.Hoffe, das hilft 🙂
Können Sie nicht die Größe einer bitmap gibt es einfach nicht eine eingebaute Möglichkeit. Sie können sich allerdings die Größe der Inhalte (eine Datei), die ist, was Sie wahrscheinlich tun müssen. So etwas sollte funktionieren.