2013-06-25 9 views
7

Hi!Android. Jak napisać tekst na naprawdę wielkiego obrazu (bitmapy) i zapisać, że

jest następujący problem: trzeba napisać długi tekst na dość duży obraz i zapisać go tam.

Warunki:

  1. rozmiar obrazu na 3000 x 2000;
  2. Dzielenie obrazu na części jest niedozwolone, ponieważ tekst jest napisany na cały obraz od krawędzi do krawędzi.
  3. Dodano: Nie mogę użyć skali bitmapowej ani skali matrycy, ponieważ konieczne jest zapisanie tekstu na oryginalnym obrazie (w pełnym rozmiarze).
  4. Dodano: Kiedy pokazać obraz dla użytkownika używam skalę mapy bitowej options.inSampleSize = 10; i nie ma problemów z brakiem pamięci

obecnego problemu:

Kiedy próbuję załaduj ten obraz w błąd Bitmapa występuje z ograniczeniem pamięci (budżet VM).

Pytania:

  1. Jak tekst na dużym obrazie bez ładowania go do pamięci?
  2. Czy istnieją do tego biblioteki? Przykładem

Kod:

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

Obraz ma przezroczyste elementy, czy nie? – Plato

+0

brak przezroczysty używany – Andrei

+0

szczęście na tym? – Adrian

Odpowiedz

0

pierwsze użyć następującego pomoc do wczytania dużej bitmapę

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

drugie pisać na obraz i zapisać, można użyć płótna

Robię coś takiego w aplikacji. Użyj Canvas.

edytowany dół kawałek mojego kodu, który faktycznie dodaje kilka innych obrazów w tle i rzeczy też.

Mięso kodu:

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

Wskaż swoją własną wersję, która w klasie i paszy id obrazu i nic innego. Zwraca mapę bitową, abyś zrobił cokolwiek chcesz (wyświetlaj ją w widoku obrazu, pozwól użytkownikowi ją zapisać i ustawić jako tapetę).

+0

W tym wierszu 'Bitmap background = BitmapFactory.decodeResource (res, background_id) .copy (Bitmap.Config.ARGB_8888, true);' otrzymuję wyjątek "Budżet VM" na obrazie powyżej 3000 x 2000 – Andrei

+0

Uprzejmie skorzystaj z techniki tutaj - http://developer.android.com/training/displaying-bitmaps/load-bitmap.html lub możesz użyć klasy Matrix, aby zmniejszyć rozmiar obrazu – blganesh101

+0

Nie mogę użyć skali bitmapowej ani skali matrycy, ponieważ konieczne jest napisanie tekstu na oryginalnym obrazku (w pełnym rozmiarze) – Andrei

1

To nie jest dokładnie to, czego szukasz, ale może to być pomocne.

Jeśli obraz nie jest przejrzysty można zmniejszyć ilość pamięci, należy załadować go poprzez określenie RGB_565 dla swojego config tak:

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

Pełny kod 'Opcje BitmapFactory.Options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inPotgeable = true; options.inInputShareable = true; options.inPreferredConfig = Bitmap.Config.RGB_565; Bitmap bm = BitmapFactory.decodeFile (filePath, options); 'I nadal otrzymuję wyjątek" java.lang.OutOfMemoryError: rozmiar mapy bitowej przekracza budżet maszyn wirtualnych " – Andrei

Powiązane problemy