Загрузка растрового изображения с помощью 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);

}

1 ответ

Решение

Кажется, ваш URI неверен. Он должен начинаться с file:///

Другие вопросы по тегам