2013-06-25 6 views
7

Hi!Android. Wie schreibe ich Text auf ein wirklich großes Bild (Bitmap) und speichere das

Ist das folgende Problem: Ich muss einen langen Text auf einem ziemlich großen Bild schreiben und es dort speichern.

Bedingungen:

  1. Bildgröße über 3000 x 2000;
  2. Divide das Bild in Teile ist nicht erlaubt, weil der Text auf ein ganzes Bild von Kante zu Kante geschrieben werden.
  3. Hinzugefügt: Ich kann nicht die Bitmap-Skala oder Matrix-Skala verwenden, da es notwendig ist, Text auf dem Originalbild (in voller Größe) zu schreiben.
  4. Hinzugefügt: Als ich das Bild dem Benutzer zeigen, verwende ich Bitmap Skala: options.inSampleSize = 10; und keine Probleme mit fehlenden Speicher

Das aktuelle Problem:

Wenn ich versuche, Laden Sie dieses Bild in Bitmap-Fehler tritt bei der Begrenzung des Arbeitsspeichers (VM-Budget) auf. Fragen

:

  1. Wie auf einem großen Bild in Text, ohne sie in den Speicher zu laden?
  2. Können vorhandene Bibliotheken dafür?

Code-Beispiel:

// 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

Das Bild transparente Teile hat oder nicht? – Plato

+0

nein transparent verwendet – Andrei

+0

etwas Glück auf diesem einen? – Adrian

Antwort

0

Erstens die folgende Hilfe verwenden, um großen Bitmap

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

zweitens laden auf dem Bild zu schreiben und speichern, können Sie Leinwand verwenden können

Ich mache so etwas in einer App. Verwenden Sie Leinwand.

Ich habe ein Stück meines Codes bearbeitet, der tatsächlich ein paar andere Bilder auf dem Hintergrund hinzufügt und so.

Fleisch von Code:

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

Setzen Sie Ihre eigene Version davon in einer Klasse und füttern sie das Bild-ID und alles andere. Es gibt eine Bitmap zurück, mit der Sie alles machen können, was Sie wollen (zeigen Sie es in einer Bildansicht an, lassen Sie den Benutzer speichern und als wallpape festlegen).

+0

In dieser Zeile 'Bitmap Hintergrund = BitmapFactory.decodeResource (res, Hintergrund_ID) .copy (Bitmap.Config.ARGB_8888, true);' Ich erhalte eine Ausnahme "VM Budget" auf dem Bild mehr als 3000 x 2000 – Andrei

+0

Bitte verwenden Sie die Technik hier - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html oder Sie könnten Matrix-Klasse verwenden, um die Größe des Bildes zu reduzieren – blganesh101

+0

Ich kann nicht die Bitmap-Skala oder Matrix-Skala verwenden, als es ist notwendig, Text auf dem Originalbild zu schreiben (in voller Größe) – Andrei

1

Dies ist nicht genau das, was Sie suchen, aber es könnte hilfreich sein.

Wenn Ihr Bild nicht transparent ist Sie die Größe des Speichers reduzieren können Sie es laden müssen durch die Angabe RGB_565 für seine Config wie folgt aus:

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

Vollständiger Code "BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inPurgeable = wahr; options.inInputShareable = true; options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bm = BitmapFactory.decodeFile (Dateipfad, Optionen); 'Und trotzdem erhalte ich eine Ausnahme" java.lang.OutOfMemoryError: Bitmap-Größe überschreitet VM-Budget " – Andrei

Verwandte Themen