【问题标题】:how can I add timestamp in captured photo in android如何在android中捕获的照片中添加时间戳
【发布时间】:2020-11-10 12:47:13
【问题描述】:
@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateTime = sdf.format(Calendar.getInstance().getTime());
        Bundle extras = data.getExtras();
        Bitmap src= (Bitmap) extras.get("data");
        int w = src.getWidth();
        int h = src.getHeight();

        Bitmap result = Bitmap.createBitmap(w, h, src.getConfig());
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(src, 0, 0, null);
        canvas.drawText(dateTime , 0, 0, null);
        click_image_id.setImageBitmap(result);
    }
}

如果我更改并评论画布实现,它会崩溃 //

Bundle extras = data.getExtras();

Bitmap src= (Bitmap) extras.get("data");

click_image_id.setImageBitmap(src);

它执行视图,但我需要图像中的时间戳,需要帮助专家

【问题讨论】:

  • 你能发布崩溃日志吗?
  • 引起:java.lang.NullPointerException:尝试从空对象引用@BogdanAndroid上的字段'int android.graphics.Paint.mBidiFlags'读取
  • 进程:workman.com.internetlistener,PID:22783 java.lang.RuntimeException:传递结果失败ResultInfo{who=null,request=1888,result=-1,data=Intent {act=inline -数据(有额外)}}活动{workman.com.internetlistener/workman.com.Watermarker.MainActivity}:java.lang.NullPointerException:尝试从字段'int android.graphics.Paint.mBidiFlags'读取null对象引用@BogdanAndroid
  • 好的,我有你的问题@SECECSEA,我现在就写答案
  • 拍照并在同一个活动中查看,所以我写了 onActivityResult 来获取图片,没有画布对象实现,我可以像 // 2 代码一样查看同一活动上的图像,但同时添加画布通过它崩溃的位图在捕获的图像中添加水印。你能明白我的意思吗@BogdanAndroid

标签: android canvas bitmap watermark


【解决方案1】:

您需要创建和配置一个Paint 对象并在canvas.drawText() 中使用它。试试这样的东西(取自this文章)。


private fun drawTextToBitmap(bitmap: Bitmap, textSize: Int = 78, text: String): Bitmap {

    val canvas = Canvas(bitmap)
    
    // new antialised Paint - empty constructor does also work
    val paint = Paint(Paint.ANTI_ALIAS_FLAG)
    paint.color = Color.BLACK
    
    // text size in pixels
    val scale = resources.displayMetrics.density
    paint.textSize = (textSize * scale).roundToInt().toFloat()

    //custom fonts or a default font
    val fontFace = ResourcesCompat.getFont(context, R.font.acrobat)
    paint.typeface = Typeface.create(fontFace, Typeface.NORMAL)


    // draw text to the Canvas center
    val bounds = Rect()
    //draw the text
    paint.getTextBounds(text, 0, text.length, bounds)

    //x and y defines the position of the text, starting in the top left corner
    canvas.drawText(text, x, y, paint)
    return bitmap
}

【讨论】:

  • Paint 对象的空构造函数使用默认数据,并不完全需要对其进行配置,但您的回答可以帮助寻求自定义 Paint 对象的人。
  • 构造函数可能为空,是的。但是如果没有进一步的配置,你不能将它用于这个问题。
  • 是的,你可以,检查我最后的答案编辑,我自己测试过。
【解决方案2】:

您的问题是您需要drawText() 需要的Paint 对象,它不能为空。这里是解决你的 NPE 的代码。

编辑:

第二个问题是绘制文本的位置,复制粘贴这个解决方案。它会在左下角放置一个带有日期的黑色文本。

如果要自定义文本,请自定义 Paint 对象。我检查了这段代码,它工作正常。

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateTime = sdf.format(Calendar.getInstance().getTime());
        Bundle extras = data.getExtras();
        Bitmap src= (Bitmap) extras.get("data");
        int w = src.getWidth();
        int h = src.getHeight();

        Bitmap result = Bitmap.createBitmap(w, h, src.getConfig());
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(src, 0, 0, null);
        canvas.drawText(dateTime , 0, h, new Paint());
        click_image_id.setImageBitmap(result);
    }
}

【讨论】:

  • 是的,现在它没有崩溃,但日期和时间不在图片中@Bogdan Android
  • @SECECSEA 您必须在使用 Paint 对象之前对其进行配置。 Here是有详细例子的文章。
  • 好的,又发现了问题,再给我一个@SECECSEA
  • 好的,完成,复制新代码并检查@SECECSEA。
【解决方案3】:

感谢@ASP 和@BogdonAndroid 的努力,这段代码终于可以正常工作了

我已经检查了solution

public static Bitmap mark(Bitmap src, boolean underline) {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateTime = sdf.format(Calendar.getInstance().getTime());
    int w = src.getWidth();
    int h = src.getHeight();
    Bitmap result = Bitmap.createBitmap(w, h, src.getConfig());
    Canvas canvas = new Canvas(result);
    Paint tPaint = new Paint();
    tPaint.setTextSize(15);
    tPaint.setColor(Color.BLUE);
    tPaint.setStyle(Paint.Style.FILL);
    float height = tPaint.measureText("yY");
    canvas.drawBitmap(src,0,0,null);
    canvas.drawText(dateTime, 20f, height+15f, tPaint);
    return result;}

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多