Androide. Cómo escribir texto en la imagen realmente grande (mapa de bits) y guardar

¡Hola!

Es el siguiente problema: Necesito escribir un texto largo en una imagen bastante grande y guardar allí.

Condiciones:

  1. Tamaño de imagen superior a 3000 x 2000;
  2. Dividir la imagen en partes no está permitido porque el texto se escribirá en una imagen entera de borde a borde.
  3. Añadido: No puedo usar la escala de mapa de bits o la escala de matriz, ya que es necesario escribir texto en la imagen original (en tamaño completo).
  4. Añadido: Cuando muestro la imagen al usuario, uso la escala de mapa de bits: options.inSampleSize = 10; Y no hay problemas con la falta de memoria

El problema actual:

Cuando intento cargar esta imagen en error de mapa de bits se produce con la limitación de la memoria (presupuesto de VM).

Preguntas:

  1. Cómo texto en una imagen grande sin cargarlo en la memoria?
  2. ¿Pueden las bibliotecas existentes para esto?

Ejemplo de código:

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

Esto no es exactamente lo que está buscando, pero podría ser útil.

Si su imagen no es transparente , puede reducir la cantidad de memoria que necesita para cargarla especificando RGB_565 para su configuración como esta:

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

En primer lugar, utilice la siguiente ayuda para cargar grandes mapas de bits

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

En segundo lugar para escribir en la imagen y guardar, puede utilizar lienzo

Hago algo como esto en una aplicación. Utilice Lienzo.

He editado un pedazo de mi código, que en realidad agrega un par de otras imágenes en el fondo y cosas también.

Carne de código:

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

Ponga su propia versión de que en una clase y alimentar a la identificación de la imagen y cualquier otra cosa. Devuelve un mapa de bits para que puedas hacer lo que quieras (mostrarlo en una vista de imagen, dejar que el usuario lo guarde y configurarlo como wallpape).

  • Jcodec vídeo de imágenes y sonido
  • Android: obtener un recurso de imagen en Uri: IllegalArgumentException
  • Botones de forma personalizada en Android - ¿Lo estoy haciendo bien?
  • Android programaticamente mosaico imagen como fondo
  • Invisible / botón transparente que funciona como un regular en android?
  • ¿Cómo puedo hacer la imagen opaca a algún nivel?
  • Al obtener una imagen de la URL de su java.net.UnknownHostException: Host no está resuelto en el dispositivo Android?
  • Problema de conversión de URI a Bitmap (2014):
  • Facebook Compartir imagen Url junto con el enlace en android
  • Cómo obtener datos Exif de un InputStream en lugar de un archivo?
  • Cómo puedo crear un RecyclerView con una imagen de tamaño fijo que envuelva el contenido y la imagen centrada en el cultivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.