2

在我的活动中,我想修改图像以在其上添加文本。

在画廊中选择图像或使用相机拍摄图像,然后将其存储在先前活动中的文件中。然后该文件的 uri 通过 extras 传递。

现在我尝试在图像顶部添加一个字符串,如下所示:

try {
        modifyThePic(imageUri);
    } catch (IOException e) {
        e.printStackTrace();
    }

这是函数的主体:

public void modifyThePic(Uri imageUri) throws IOException {

    ImageDecoder.Source source = ImageDecoder.createSource(this.getContentResolver(), imageUri);
    Bitmap bitmap = ImageDecoder.decodeBitmap(source);
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(10);
    canvas.drawText("Some Text here", 0, 0, paint);

    image.setImageBitmap(bitmap); //image is the imageView to control the result

}

预期的行为是在其顶部显示带有“Some Text here”的图像。但是没有显示任何内容,但是应用程序不会崩溃。

在调试时,我遇到了一个出现在

位图位图 = ImageDecoder.decodeBitmap(source);

画布画布=新画布(位图);

这是错误:

java.io.FileNotFoundException:没有内容提供者:/storage/emulated/0/Android/data/com.emergence.pantherapp/files/Pictures/JPEG_20200829_181926_7510981182141824841.jpg

我怀疑我误用了“ImageDecoder”,因为这是我第一次使用它。更准确地说,我无法让onCreate中的“decodeBitmap”方法,Android Studio告诉我它不能在“主线程”中,我对线程一点也不熟悉。将它移动到专用函数中解决了这个问题,但也许我应该做其他事情,这是问题的根源。

我的问题: 我是否使用正确的工具来修改文件并在其上添加文本?如果是,我做错了什么?如果没有,我应该研究什么库/工具来完成这项任务?

谢谢,

编辑:附加答案元素

正如@blackapps 和@rmunge 都指出的那样,我得到的不是合法的URI,而是文件路径。解决我的问题的简单方法是使用以下代码从路径中获取 URI:

Uri realuri = Uri.fromFile(new File("insert path here")));

另外要编辑位图,它必须是可变的,例如这里介绍的。

从 URI 中提取位图并在其上添加文本的最后一个函数是:

public void modifyThePic(Uri imageUri) throws IOException {

    ContentResolver cr = this.getContentResolver();
    InputStream input = cr.openInputStream(imageUri);
    Bitmap bitmap = BitmapFactory.decodeStream(input).copy(Bitmap.Config.ARGB_8888,true);

    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    paint.setColor(Color.BLACK);
    paint.setTextSize(300);

    int xPos = (canvas.getWidth() / 2); //just some operations to center the text
    int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ;

    canvas.drawText("SOME TEXT TO TRY IT OUT", xPos, yPos, paint);

    image.setImageBitmap(bitmap);

}
4

1 回答 1

1

看来你的 URI 是错误的。它必须以 file:/// 开头

于 2020-08-29T17:44:07.797 回答