先看效果图,图片大了一点。
原理很简单,就是从本地读取图片,获取Bitmap,绘制矩形和文本后,在保存到本地。刚接手这个功能的时候,感觉很难搞,其实还好吧,也被坑了一个多小时,闲话少说,上代码。
代码:
/** * 添加文本到图片 */ private void addTextToJpg() { //从文件中获取bitmap Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/fengjing.jpg"); ivSrc = (ImageView) findViewById(R.id.iv_src); Bitmap bit = drawTextToBitmap(bitmap, "你好"); //展示到页面 ivSrc.setImageBitmap(bit); //保存到本地文件 saveBitmapToSDCard(bit, "/sdcard/temp/result.jpg"); }
/** * 添加文本到图片的方法 * @param bitmap * @param gText * @return */ public Bitmap drawTextToBitmap(Bitmap bitmap, String gText) { android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); if (bitmapConfig == null) { bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; } bitmap = bitmap.copy(bitmapConfig, true); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //绘制矩形,左,上,右,下,左上角距离,214*80 //注意,原图是800*600,要求矩形214*80,矩形在图片中水平居中,底部距离5像素,所有矩形的左,上,右,下,计算得出下面的数字 //这里可以抽出去的,根据原图大小和矩形大小位置来自动生成,时间关系不再做了 Rect targetRect = new Rect(293, 515, 507, 595); // 绘制矩形区域-实心矩形 paint.setColor(Color.parseColor("#ffffff")); // 设置样式-填充 paint.setStyle(Paint.Style.FILL); canvas.drawRect(targetRect, paint); //绘制文本 paint.setStrokeWidth(3);//文本的粗细 paint.setTextSize(70);//文本大小 paint.setColor(Color.BLACK);//文本颜色 Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt(); //设置文本对其基线 int baseline = (targetRect.bottom + targetRect.top - fontMetrics.bottom - fontMetrics.top) / 2; // 下面这行是实现水平居中,drawText对应改为传入targetRect.centerX() paint.setTextAlign(Paint.Align.CENTER); canvas.drawText(gText, targetRect.centerX(), baseline, paint);//居中对其到矩形中 return bitmap; }
/** * 将bitmap存在SDCard中 * * @param fingerprint_bitmap * @return 返回所存路径 */ public static void saveBitmapToSDCard(Bitmap fingerprint_bitmap, String filePath) { FileOutputStream fos = null; try { fos = new FileOutputStream(filePath); if (fos != null) { fingerprint_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } fos.flush(); fos.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }