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í.
- Perder fondo transparente al descargar una imagen PNG externa
- Cargar una imagen de la carpeta de activos
- Margen inferior o relleno no funciona en el diseño relativo en xml en android
- Una sola intención de permitir que el usuario tome una foto O escoge una imagen de la galería en Android
- Compartir imagen con whatsapp en android
Condiciones:
- Tamaño de imagen superior a 3000 x 2000;
- Dividir la imagen en partes no está permitido porque el texto se escribirá en una imagen entera de borde a borde.
- 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).
- 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:
- Cómo texto en una imagen grande sin cargarlo en la memoria?
- ¿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 | |________________________________________________| */
- Cómo convertir imágenes de JPEG / BMP a formato XBM
- Cómo obtener imágenes cuadradas como la aplicación de Gmail
- Filtros de imagen y video como snapchat en android
- Android SkImageDecoder :: Factory devuelto null Error
- Diferencia entre los formatos de imagen RGB888 y ARGB8888
- Cómo recuperar ImageUri de un ImageView?
- Android Cómo obtener una vista previa de una imagen, utilizando su ruta de acceso desde SDcard, desde mi aplicación
- ¿Cómo preparar una imagen para una pantalla de densidad más pequeña?
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).
- ¿Existe un método aceptable de plataforma cruzada para mostrar un teclado numérico en formularios web estándar en un dispositivo basado en táctil?
- ¿Puedo crear un calificador de configuración personalizado para android?