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