Загрузка растрового изображения с помощью ImageDecoder из URI и добавление текста
В своей деятельности я хочу изменить изображение, чтобы добавить на него текст.
Изображение выбирается в галерее или снимается камерой, а затем сохраняется в файле в предыдущем действии. Затем 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" поверх него. Но вместо этого ничего не отображается, однако приложение не падает.
Во время отладки я обнаружил ошибку, которая появляется между
Bitmap bitmap = ImageDecoder.decodeBitmap(источник);
и
Холст холст = новый холст (растровое изображение);
вот ошибка:
java.io.FileNotFoundException: нет поставщика контента: /storage/emulated/0/Android/data/com.emergence.pantherapp/files/Pictures/JPEG_20200829_181926_7510981182141824841.jpg
Я подозреваю, что неправильно использую "ImageDecoder", поскольку я использую его впервые. Точнее, у меня не было возможности включить метод decodeBitmap в onCreate, 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);
}