web-dev-qa-db-fra.com

Comment dessiner un texte sur une image?

Je veux dessiner du texte sur l'image (pour enregistrer cette image avec du texte). J'ai image view je mis bitmap à cette image je veux dessiner le texte sur l'image (texte entré par l'utilisateur). J'ai essayé cela avant de sauver .....

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

Le code XML est ..

<FrameLayout 
     Android:id="@+id/framelayout"
     Android:layout_marginTop="30dip"
     Android:layout_height="fill_parent" 
     Android:layout_width="fill_parent">

     <ImageView 
          Android:id="@+id/ImageView01"
          Android:layout_alignParentTop="true"
          Android:layout_height="wrap_content" 
          Android:layout_width="wrap_content"/>

     <TextView Android:id="@+id/text_view2"
          Android:layout_marginTop="20dip"
          Android:layout_width="wrap_content" 
          Android:text="SampleText"
          Android:textSize="12pt"
          Android:layout_alignTop="@+id/ImageView01" 
          Android:layout_height="wrap_content"/>  

</FrameLayout>
19

Mise à jour de la méthode SaveImage (), pour prendre en charge le dessin de texte.

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

Faites-moi savoir si cela fonctionne pour vous.

Shash

19
Shash316

Comme suggéré par Vladislav Skoumal , essayez cette méthode:

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

}

appeler cette méthode 

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

le résultat

enter image description here

48
Dwivedi Ji

Vous pouvez étendre une vue pour créer une vue personnalisée. Quelque chose comme

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

Dans la méthode ondraw, vous pouvez utiliser canvas.drawBitmap et canvas.drawText pour dessiner des bitmaps et du texte.

De cette façon, vous n'avez pas besoin d'un framelayout car tout est dans une seule vue personnalisée.

Vous pouvez l'inclure dans votre fichier xml en tant que

<com.raj.PieView Android:id="@+id/framelayout" Android:layout_marginTop="30dip"      
    Android:layout_height="fill_parent" Android:layout_width="fill_parent"/>
1
blessenm
  1. créer un bitmap vide
  2. créer un nouvel objet Canvas et lui transmettre ce bitmap
  3. appelez view.draw (Canvas) en lui passant l'objet de travail que vous venez de créer. Reportez-vous à la documentation de la méthode pour plus de détails.
  4. Utilisez Bitmap.compress () pour écrire le contenu du bitmap dans un fichier OutputStream, éventuellement.

Pseudo code:

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); 
1
Balaji.K

Je résous ce problème (fichier immuable), mais rien n’est écrit dans le fichier ... suivez mon code: Public static Fichier writeOnImage (fichier fichier) lève 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;
}
0
LeandroPortnoy

Gonflez une vue texte sur l'image . Reportez-vous à http://www.Android10.org/index.php/forums/43-view-layout-a-resource/715-tutorial-Android-xml-view- inflation pour un exemple élémentaire ..__ Cela devrait être le moyen le plus simple.

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);
0
Pavankumar Vijapur