it-swarm.com.de

Wie zeichnet man Text auf dem Bild?

Ich möchte Text auf ein Bild zeichnen (um das Bild mit Text zu speichern). Ich habe eine Bildansicht. Ich setze Bitmap auf dieses Bild. Ich möchte den Text auf das Bild zeichnen (vom Benutzer eingegebener Text). Ich habe dies vor dem Speichern versucht .....

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

XML-Code lautet ..

<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

Die Methode SaveImage () wurde aktualisiert, um das Zeichnen von Text zu unterstützen.

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

Lassen Sie mich wissen, ob dies für Sie funktioniert.

Schasch

19
Shash316

Versuchen Sie diese Methode: vorgeschlagen von Vladislav Skoumal :

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

}

rufen Sie diese Methode auf 

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

die Ausgabe

enter image description here

48
Dwivedi Ji

Sie können eine Ansicht erweitern, um eine benutzerdefinierte Ansicht zu erstellen. So etwas wie

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

In der ondraw-Methode können Sie canvas.drawBitmap und canvas.drawText verwenden, um Bitmaps und Text zu zeichnen.

Auf diese Weise benötigen Sie kein Framelayout, da sich alles in einer einzigen benutzerdefinierten Ansicht befindet.

Sie können dies in Ihre XML-Datei einfügen

<com.raj.PieView Android:id="@+id/framelayout" Android:layout_marginTop="30dip"      
    Android:layout_height="fill_parent" Android:layout_width="fill_parent"/>
1
blessenm
  1. erstellen Sie eine leere Bitmap
  2. erstellen Sie ein neues Canvas-Objekt und übergeben Sie dieses Bitmap
  3. rufen Sie view.draw (Canvas) auf und übergeben Sie das soeben erstellte Canvas-Objekt. Weitere Informationen finden Sie in der Dokumentation der Methode.
  4. Verwenden Sie Bitmap.compress (), um den Inhalt der Bitmap in einen OutputStream (möglicherweise in eine Datei) zu schreiben.

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

Ich löse dieses Problem (unveränderliche Datei), aber in der Datei ist nichts geschrieben ... folgen Sie meinem Code: Public static Datei writeOnImage (Datei) löst IOException aus

    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

Blasen Sie eine Textansicht über das Bild. Ein grundlegendes Beispiel finden Sie unter http://www.Android10.org/index.php/forums/43-view-layout-a-resource/715-tutorial-Android-xml-view-inflation . Dies sollte der einfachste Weg sein.

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