2011-01-17 17 views
36

Ho la mia applicazione che sta visualizzando immagini con rapporto diverso, ridimensionato all'interno (centerInside) imageView. Quello di cui ho bisogno è creare bitmap da ImageView incluso lo sfondo (nero in questo caso).Android: come convertire l'intero ImageView in Bitmap?

Ad esempio, ho uno schermo del dispositivo 320x480, un'immagine a schermo intero con un'immagine ridimensionata a 280x480. Come posso ottenere 320x480 bitmap da esso?

In cima a questa vista immagine ho alcuni logo o pulsanti che non voglio includere in bitmap, sono come al livello superiore. Tutto ciò di cui ho bisogno è bitmap con immagine e bordo nero da alcuni lati.

risposta

88

Si potrebbe semplicemente utilizzare la cache di immagini di imageView. Renderà l'intera vista come è disposta (ridimensionata, confinata con uno sfondo, ecc.) In una nuova bitmap.

assicurati che sia stato creato.

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

c'è il bitmap come lo ha visto lo schermo.

+2

Sembra buono ma apre la critica con NullPointerException. È perché l'immagine non è ancora stata costruita? – yosh

+5

Ok, insieme a http://stackoverflow.com/questions/2339429/android-view-getdrawingcache-returns-null-only-null ha risolto il mio problema :) Grazie. – yosh

+4

La documentazione afferma che 'buildDrawingCache()' dovrebbe essere chiamata da 'destroyDrawingCache' (vedi qui: http://developer.android.com/reference/android/view/View.html#buildDrawingCache%28boolean%29) –

54

Hai provato:

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

Dà la dimensione dell'immagine, ma non è questo il problema. Ho bisogno di un modo veloce per creare bitmap con bordo nero. Qui suppongo di dover calcolare l'orientamento e il centro dell'immagine e entrambi i bordi neri per aggiungerli manualmente alla bitmap creata dall'immagine. – yosh

+0

Definitivamente la soluzione migliore, se si desidera ottenere il contenuto effettivo di un ImageView e non solo le parti visibili. –

+0

Si noti che imageView.getDrawingCache() otterrà la rappresentazione bitmap effettiva, la bitmap andrebbe persa quando la cache viene cancellata. – secretlm

4

Basta pensare ad alta voce qui (con certamente poca esperienza di lavoro con la grafica in Java) forse qualcosa di simile potrebbe funzionare ?:

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); 

Per curiosità, cosa stai cercando di realizzare? Potrebbe esserci un modo migliore per raggiungere il tuo obiettivo rispetto a quello che hai in mente.

+1

Ho bisogno di affettare lo schermo intero e voglio avere bordi neri quando c'è per esempio solo metà immagine su tile + Voglio avere un'immagine centrata sullo schermo. La tela riporta alcune brutte memorie J2ME: D – yosh

+0

Forse sto fraintendendo ... vuoi semplicemente affiancare l'immagine? È possibile definire un file bitmap estraibile in XML che si affianca automaticamente. Non capisco esattamente cosa stai chiedendo. – kcoppock

+0

Voglio dividere le immagini in quadrati (ad esempio 50x50) incluso lo sfondo nero. Le immagini hanno diversi colori/rapporti. Ho pensato che il modo più veloce sarebbe creare bitmap da ImageView completo, non solo il contenuto dell'immagine. – 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

Si tratta di un codice di lavoro

imageView.setDrawingCacheEnabled(true); 
imageView.buildDrawingCache(); 
Bitmap bitmap = Bitmap.createBitmap(imageView.getDrawingCache()); 
Problemi correlati