Алгоритм заливки растрового изображения с использованием Android Renderscript

Я пытаюсь создать приложение, которое закрашивает изображения цветом. Он отлично работает с использованием Java, но из-за некоторых проблем с производительностью я хочу заполнить растровые изображения с помощью рендерскрипта. Я много чего гуглил о рендерскрипте, но ничего подходящего не нашел. Ребята, подскажите, пожалуйста, как заполнить растровые изображения с помощью рендерскрипта. Любая помощь будет оценена. Спасибо


person Jitendra Singh    schedule 03.09.2018    source источник


Ответы (1)


Основное, что вам нужно сделать, это создать Allocation для ввода Bitmap, а затем изменяемые Bitmap и Allocation для вывода. Предполагая, что у вас есть входное растровое изображение с именем inputBitmap, оно может выглядеть примерно так:

private RenderScript        mRsCtx;   //  RenderScript context, created during init
private ScriptC_bitmapFill  mFill;    //  RS kernel instance, created during init
.
.
.
public Bitmap doFill(Bitmap inputBitmap) {

    //  Ensure your input bitmap is also in ARGB8888
    Bitmap  output = Bitmap.createBitmap(inputBitmap.getWidth(),
                                         inputBitmap.getHeight(),
                                         Bitmap.Config.ARGB_8888);
    Allocation  outAlloc = Allocation.createFromBitmap(mRsCtx, output);
    Allocation  inAlloc = Allocation.createFromBitmap(mRsCtx, inputBitmap);

    //  Now call your kernel then copy back the results
    mFill.forEach_root(inAlloc, outAlloc);
    outAlloc.copyTo(outBitmap);
    return outBitmap;
} 

Если вы просто заполняете все изображение или даже область, у вас будет ядро ​​RS, которое изменит значение пикселя в определенных местах, когда для этого будет вызвано ядро. Вот очень простое ядро ​​RS, которое просто заполняет все изображение сплошным цветом:

#pragma version(1)

#pragma rs java_package_name(com.example.bitmapfill)

void root(const uchar4 *v_in, uchar4 *v_out) {
    v_out->r = 0x12;
    v_out->g = 0x34;
    v_out->b = 0x56;
}

Обратите внимание, что, поскольку в этом случае вы на самом деле ничего не делаете с размещением ввода/растровым изображением (просто заполняете все это), вы можете просто пропустить размещение ввода и использовать размеры. Но если вы собираетесь манипулировать только частью ввода (небольшим подразделом), вам придется копировать другие пиксели из ввода в вывод вместо заполнения.

Для получения дополнительной информации о RS и некоторых его внутренних компонентах, производительности и т. д. вы можете найти этот доклад полезным: https://youtu.be/3ynA92x8WQo

person Larry Schiefer    schedule 04.09.2018
comment
спасибо за ответ, но основная проблема заключается в том, как написать код для ‹code›bitmapFill.rs‹/code›. Я не смог найти подходящего примера для написания кода рендерскрипта. - person Jitendra Singh; 04.09.2018
comment
Я добавил немного больше к ответу о содержании RS. - person Larry Schiefer; 04.09.2018
comment
Я ценю ваши усилия, но не нашел решения. Знаете ли вы, как передать массив пикселей в скрипт рендеринга? - person Jitendra Singh; 04.09.2018
comment
Вам нужно будет предоставить гораздо больше подробностей о том, что вы делаете, и о проблемах, с которыми вы сталкиваетесь. За исключением некоторых возможных проблем с синтаксисом (код, который я предоставил, не запускался через какой-либо компилятор), все должно было работать без проблем, если просто заполнить Bitmap сплошным цветом. Предлагаю посмотреть конф. talk Я предоставил ссылку и даже вытащил образец кода. - person Larry Schiefer; 04.09.2018
comment
Я смотрел ваше видео. Я многое узнал из этого о Renderscript. Но я хочу написать алгоритм заливки флудом, у меня есть Bitmap и touchPoint. Проверяю все похожие точки по данным touchPoint. Сэр, не могли бы вы написать для меня алгоритм заливки в скрипте рендеринга. - person Jitendra Singh; 11.09.2018
comment
Здравствуйте, сэр, не могли бы вы ответить на этот вопрос - person Jitendra Singh; 30.10.2018