Алгоритм заливки растрового изображения с помощью Android Renderscript - PullRequest
0 голосов
/ 03 сентября 2018

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

1 Ответ

0 голосов
/ 04 сентября 2018

Основное, что вам нужно сделать, это создать 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

...