Cómo dibujar texto en la imagen?

Quiero dibujar texto en la imagen (para guardar esa imagen con texto). Tengo una vista de imagen. Establezco un bitmap para esa imagen. Quiero dibujar el texto en la imagen (texto ingresado por el usuario). intenté esto antes de guardar …..

void saveImage() { File myDir=new File("/sdcard/saved_images"); myDir.mkdirs(); Random generator = new Random(); int n = 10000; n = generator.nextInt(n); String fname = "Image-"+ n +".jpg"; File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); originalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } 

El código Xml es …

     

Método actualizado SaveImage (), para admitir el dibujo de texto.

 void saveImage() { File myDir=new File("/sdcard/saved_images"); myDir.mkdirs(); Random generator = new Random(); int n = 10000; n = generator.nextInt(n); String fname = "Image-"+ n +".jpg"; File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); // NEWLY ADDED CODE STARTS HERE [ Canvas canvas = new Canvas(originalBitmap); Paint paint = new Paint(); paint.setColor(Color.WHITE); // Text Color paint.setTextSize(12); // Text Size paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); // Text Overlapping Pattern // some more settings... canvas.drawBitmap(originalBitmap, 0, 0, paint); canvas.drawText("Testing...", 10, 10, paint); // NEWLY ADDED CODE ENDS HERE ] originalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } 

Hazme saber si esto funciona para ti.

Shash

Como lo sugirió Vladislav Skoumal , pruebe este método:

  public Bitmap drawTextToBitmap(Context mContext, int resourceId, String mText) { try { Resources resources = mContext.getResources(); float scale = resources.getDisplayMetrics().density; Bitmap bitmap = BitmapFactory.decodeResource(resources, resourceId); android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); // set default bitmap config if none if(bitmapConfig == null) { bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; } // resource bitmaps are imutable, // so we need to convert it to mutable one bitmap = bitmap.copy(bitmapConfig, true); Canvas canvas = new Canvas(bitmap); // new antialised Paint Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // text color - #3D3D3D paint.setColor(Color.rgb(110,110, 110)); // text size in pixels paint.setTextSize((int) (12 * scale)); // text shadow paint.setShadowLayer(1f, 0f, 1f, Color.DKGRAY); // draw text to the Canvas center Rect bounds = new Rect(); paint.getTextBounds(mText, 0, mText.length(), bounds); int x = (bitmap.getWidth() - bounds.width())/6; int y = (bitmap.getHeight() + bounds.height())/5; canvas.drawText(mText, x * scale, y * scale, paint); return bitmap; } catch (Exception e) { // TODO: handle exception return null; } } 

llama este método

  Bitmap bmp =drawTextToBitmap(this,R.drawable.aa,"Hello Android"); img.setImageBitmap(bmp); 

La salida enter image description here

Puede extender una vista para crear una vista personalizada. Algo como

 public class PieView extends View { public PieView(Context context) { super(context); overlayBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.piechart_shade, null); overlayWidth = overlayBitmap.getWidth(); setLayoutParams(new LayoutParams(overlayWidth, overlayWidth)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } } 

En el método ondraw puedes usar canvas.drawBitmap y canvas.drawText para dibujar mapas de bits y texto.

De esta manera, no necesita un framelayout ya que todo está en una única vista personalizada.

Puede incluir esto en su archivo xml como

  
  1. crear un bitmap vacío
  2. crear un nuevo objeto Canvas y pasarle este bitmap
  3. llama a view.draw (Canvas) pasándole el objeto canvas que acabas de crear. Consulte la documentación del método para más detalles.
  4. Utilice Bitmap.compress () para escribir el contenido del bitmap en un OutputStream, archivo tal vez.

Pseudo código:

 Bitmap bitmap = Bitmap.createBitmap(200,200,Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawText(); //necessary arguments and draw whatever you want. thes all are drawn on the bitmap.finally save this bitmap bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); 

Inflar una vista de texto sobre la imagen. Consulte http://www.android10.org/index.php/forums/43-view-layout-a-resource/715-tutorial-android-xml-view-inflation para obtener un ejemplo básico. Esta debería ser la forma más fácil.

 LinearLayout lLayout; lLayout = (LinearLayout)findViewById(R.id.layout1); layout1 is the main layout. final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); TextView tv = (TextView)inflater.inflate(R.layout.text, null); lLayout.addView(tv); 

Resuelvo este problema (archivo inmutable), pero nada está escrito en el archivo … sigue mi código: público estático El archivo writeOnImage (archivo) arroja IOException {

  Bitmap originalBitmap = BitmapFactory.decodeFile(file.getPath()); originalBitmap = convertToMutable(originalBitmap); FileOutputStream out = new FileOutputStream(file); try { Canvas canvas = new Canvas(originalBitmap); Paint paint = new Paint(); paint.setColor(Color.BLACK); paint.setStrokeWidth(12); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); canvas.drawBitmap(originalBitmap, 0, 0, paint); canvas.drawText("Testing...", 10, 10, paint); originalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } return file; }