2011-01-17 23 views
36

Ich habe meine Anwendung, die Bilder mit unterschiedlichem Verhältnis anzeigt, innerhalb (centerInside) imageView geändert. Was ich brauche, ist Bitmap aus dem ImageView einschließlich des Hintergrundes (in diesem Fall schwarz) zu erstellen.Android: Wie konvertiert man ImageView in Bitmap?

So zum Beispiel habe ich Gerät Bildschirm 320x480, Vollbild imageView mit Bild auf 280x480 Größe geändert. Wie kann ich 320x480 Bitmap daraus erhalten?

Oben auf dieser Bildansicht habe ich einige Logos oder Schaltflächen, die ich nicht in Bitmap aufnehmen möchte, sie sind wie auf der obersten Ebene. Alles, was ich brauche, ist Bitmap mit Bild und schwarzem Rand von einigen Seiten.

Antwort

88

Sie könnten einfach den Bild-Cache des imageView verwenden. Es wird die gesamte Ansicht, so wie sie ausgelegt ist (skaliert, mit einem Hintergrund usw. umrandet), zu einer neuen Bitmap rendern.

nur sicherstellen, dass es gebaut wird.

imageView.buildDrawingCache(); 
Bitmap bmap = imageView.getDrawingCache(); 

Es ist Ihr Bitmap, wie der Bildschirm es sah.

+2

Hört sich gut an, aber es bringt nur den kritischen Punkt mit NullPointerException. Weil das Bild noch nicht gebaut ist? – yosh

+5

Ok, zusammen mit http://stackoverflow.com/questions/2339429/android-view-getdrawingcache-returns-null-only-null löste es mein Problem :) Danke. – yosh

+4

Der Dokumentation status 'buildDrawingCache()' sollte gefolgt werden von einem Aufruf von 'destroyDrawingCache' (siehe hier: http://developer.android.com/reference/android/view/View.html#buildDrawingCache%28boolean%29) –

54

Haben Sie versucht:

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); 
Bitmap bitmap = drawable.getBitmap(); 
+0

es die Größe des Bildes gibt, aber das ist nicht das Problem. Ich brauche einen schnellen Weg, um Bitmap mit schwarzem Rand zu erstellen. Ich denke, ich muss die Ausrichtung und die Mitte des Bildes und beide schwarzen Ränder berechnen, um sie manuell zu der aus dem Bild erstellten Bitmap hinzuzufügen. – yosh

+0

Definitiv die beste Lösung, wenn Sie den tatsächlichen Inhalt eines ImageView und nicht nur die sichtbaren Teile erhalten möchten. –

+0

Beachten Sie, dass imageView.getDrawingCache() die tatsächliche Bitmap-Darstellung erhält, die Bitmap würde verloren gehen, wenn der Cache gelöscht wird. – secretlm

4

Gerade laut hier denken heraus (mit zugegebenermaßen wenig Know-how mit Grafiken in Java arbeiten) vielleicht so etwas wie dies funktionieren würde ?:

ImageView iv = (ImageView)findViewById(R.id.imageview); 
Bitmap bitmap = Bitmap.createBitmap(iv.getWidth(), iv.getHeight(), Bitmap.Config.RGB_565); 
Canvas canvas = new Canvas(bitmap); 
iv.draw(canvas); 

Aus Neugier, Was versuchst du zu erreichen? Es kann einen besseren Weg geben, um Ihr Ziel zu erreichen als das, was Sie vorhaben.

+1

Ich muss den ganzen Bildschirm in Scheiben schneiden und schwarze Ränder haben wollen, wenn es zum Beispiel nur ein halbes Bild auf der Kachel gibt + Ich möchte das Bild zentriert auf dem Bildschirm haben. Canvas bringt einige schlechte J2ME-Erinnerungen zurück: D – yosh

+0

Vielleicht bin ich ein Missverständnis ... willst du nur das Bild kacheln? Sie können eine XML-Bitmap definieren, die automatisch gekachelt wird. Ich verstehe nicht genau, was du verlangst. – kcoppock

+0

Ich möchte Bilder in Quadrate (d. H. 50x50) einschließlich des schwarzen Hintergrunds schneiden. Bilder haben unterschiedliche Farben/Verhältnisse. Ich dachte, schneller Weg würde Bitmap aus dem gesamten ImageView, nicht nur den Bildinhalt erstellen. – yosh

1
try { 
     photo.setImageURI(Uri.parse("Location"); 
     BitmapDrawable drawable = (BitmapDrawable) photo.getDrawable(); 
     Bitmap bitmap = drawable.getBitmap(); 
     bitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true); 
     photo.setImageBitmap(bitmap); 

    } catch (Exception e) { 

    } 
0

Dies ist ein Arbeitscode

imageView.setDrawingCacheEnabled(true); 
imageView.buildDrawingCache(); 
Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache()); 
Verwandte Themen