在我的活动中,我想修改图像以在其上添加文本。
在画廊中选择图像或使用相机拍摄图像,然后将其存储在先前活动中的文件中。然后该文件的 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);
}