Я пытаюсь создать приложение, которое закрашивает изображения цветом. Он отлично работает с использованием Java, но из-за некоторых проблем с производительностью я хочу заполнить растровые изображения с помощью рендерскрипта. Я много чего гуглил о рендерскрипте, но ничего подходящего не нашел. Ребята, подскажите, пожалуйста, как заполнить растровые изображения с помощью рендерскрипта. Любая помощь будет оценена. Спасибо
Алгоритм заливки растрового изображения с использованием Android Renderscript
Ответы (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
Bitmap
сплошным цветом. Предлагаю посмотреть конф. talk Я предоставил ссылку и даже вытащил образец кода.
- person Larry Schiefer; 04.09.2018