2013-06-25 10 views
7

Ciao!Android. Come scrivere testo su un'immagine veramente grande (bitmap) e salvare che

È il seguente problema: Ho bisogno di scrivere un testo lungo su un'immagine abbastanza grande e salvarlo lì.

Condizioni:

  1. dimensioni dell'immagine sopra 3000 x 2000;
  2. Dividere l'immagine in parti non è consentito perché il testo deve essere scritto su un'intera immagine da un bordo all'altro.
  3. Aggiunto: Non è possibile utilizzare la scala Bitmap o la scala Matrix, in quanto è necessario scrivere testo sull'immagine originale (a grandezza originale).
  4. Aggiunto: Quando mostro l'immagine per l'utente che uso scala Bitmap: options.inSampleSize = 10; e senza problemi con la mancanza di memoria

Il problema attuale:

Quando provo a caricare questa immagine in errore Bitmap si verifica con la limitazione della memoria (budget VM).

Domande:

  1. Come testo su un'immagine grande senza caricarlo in memoria?
  2. Possono librerie esistenti per questo? esempio

Codice:

// Step 1. Open image and load to Bitmap 
Bitmap bitmap = BitmapFactory.decodeFile(fileName); // runtime Exception like "VM budget" ! 
// or 
//Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.big_img_1); // as in previous runtime Exception like "VM budget" ! 
// or 
//Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream); // as in previous runtime Exception like "VM budget" ! 


// Step 2. Write text 
Paint paint = new Paint(); 
paint.setColor(Color.BLACK); 
paint.setTextSize(14); 

Canvas canvas = new Canvas(bitmap); 
canvas.drawText("some long long string over all image", 100, 100, paint); 

// Step 3. Save bitmap to file 
OutputStream fOut = new FileOutputStream(new File(fileName)); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut); 
fOut.flush(); 
fOut.close(); 
/* 
    _________________________________________________ 
    |            | 
    |            | 
    |            | 
    |            | 
    |      IMG      | 
    |            | 
    |            | 
    | some long long string over all image | 
    |________________________________________________| 
    */ 
+0

L'immagine ha parti trasparenti o no? – Plato

+0

non trasparente usato – Andrei

+0

fortuna su questo? – Adrian

risposta

0

utilizzare in primo luogo il seguente aiuto per caricare bitmap grande

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

in secondo luogo per scrivere su un'immagine e salvarla, è possibile utilizzare tela

Faccio qualcosa di simile in un'app. Usa la tela.

Ho modificato un pezzo del mio codice, che in realtà aggiunge un paio di altre immagini sullo sfondo e altre cose.

Carne di codice:

private static Bitmap getPoster(...) { 
Bitmap background = BitmapFactory.decodeResource(res, background_id) 
    .copy(Bitmap.Config.ARGB_8888, true); 
Canvas canvas = new Canvas(background); 
Typeface font = Typeface.createFromAsset(res.getAssets(), FONT_PATH); 
font = Typeface.create(font, Typeface.BOLD); 
Paint paint = new Paint(); 
paint.setTypeface(font); 
paint.setAntiAlias(true); 
paint.setColor(Color.WHITE); 
paint.setStyle(Style.FILL); 
paint.setShadowLayer(2.0f, 1.0f, 1.0f, Color.BLACK); 
float fontSize = getFontSize(background.getWidth(), THE_QUOTE, paint); //You'll have to define a way to find a size that fits, or just use a constant size. 

paint.setTextSize(fontSize); 
canvas.drawText(THE_QUOTE, (background.getWidth() - paint.measureText(THE_QUOTE))/2, 
    background.getHeight() - FILLER_HEIGHT, paint); //You might want to do something different. In my case every image has a filler in the bottom which is 50px. 
return background; 
} 

Mettere la propria versione di quello in una classe e alimentano l'ID immagine e quant'altro. Restituisce una bitmap che ti permette di fare tutto ciò che vuoi (visualizzalo in un'immagine, lascia che l'utente lo salvi e lo imposti come wallpape).

+0

In questa riga 'Bitmap background = BitmapFactory.decodeResource (res, background_id) .copy (Bitmap.Config.ARGB_8888, true);' Ricevo un'eccezione "VM budget" sull'immagine più di 3000 x 2000 – Andrei

+0

Gentilmente usa la tecnica qui - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html oppure potresti usare la classe Matrix per ridurre le dimensioni dell'immagine – blganesh101

+0

Non riesco a usare la scala Bitmap o la scala Matrix, come è necessario scrivere del testo sull'immagine originale (a schermo intero) – Andrei

1

Questo non è esattamente quello che stai cercando, ma potrebbe essere utile.

Se l'immagine non è trasparente è possibile ridurre la quantità di memoria è necessario caricarlo specificando RGB_565 per esso è config in questo modo:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.RGB_565; 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image, options); 
+0

Codice completo 'BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inPurgeable = true; options.inInputShareable = true; options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bm = BitmapFactory.decodeFile (filePath, opzioni); 'E ancora ricevo un'eccezione" java.lang.OutOfMemoryError: dimensione bitmap supera il budget della VM " – Andrei

Problemi correlati