捕获位图并添加水印

时间:2013-05-13 12:34:29

标签: java android

我尝试捕获图像并从onActivityResult方法设置水印是我代码中的片段。

 Private void savingCapturedImage() {
   long date = System.currentTimeMillis();
   Date data = new Date(date);
   File file = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera", "mobiliskaita.JPG");
   Uri imagePath = Uri.fromFile(file);

    try {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imagePath);
        System.out.println("bitmap: " + bitmap.getWidth() + " " + bitmap.getHeight());
        file.delete();
        bitmap = mark(bitmap, String.valueOf(data), 100, 200, 100, false);
        bitmap = mark(bitmap, TheGlobals.partneriaiValue, 100, 310, 100, false);


        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        bitmap.recycle();
        File fileOutput = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera", photoName());
        fileOutput.createNewFile();
        FileOutputStream fo = new FileOutputStream(fileOutput);
        fo.write(bytes.toByteArray());
        fo.flush();
        fo.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


  private Bitmap mark(Bitmap src, String watermark, int x, int y, int size, boolean underline) {
    int w = src.getWidth();
    int h = src.getHeight();
    Point _p = new Point();
    _p.x = x;
    _p.y = y;

    final float scale = getResources().getDisplayMetrics().density;
    int p = (int) (900 * scale + 0.5f);

    Bitmap result = Bitmap.createScaledBitmap(src, p, p, true);

    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(src, 0, 0, null);

    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(R.dimen.default_text_size);
    paint.setAntiAlias(true);
    paint.setUnderlineText(underline);
    canvas.drawText(watermark, _p.x, _p.y, paint);

    return result;
}

它正在工作,但后来我有8或更高的百万像素相机,我得到out of memory期望。也许有人可以帮助我解决这个问题?

1 个答案:

答案 0 :(得分:1)

来自相机的位图会很大,如果你只是将其保存为900x900,那么你可能不得不使用另一种方法来读取它(不是MediaStore.Images.Media.getBitmap()),您可以在其中设置inSampleSize:http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String,android.graphics.BitmapFactory.Options)

在将它绘制到画布后,您还可以在mark()中回收src。目前您正在创建2个900x900dp位图,因此将2个调用合并到标记也可能会有所帮助。

相关问题