Мне трудно использовать RenderScript для преобразования YUV_420_888
изображения в RGB_565
. Программа SIGSEGV
-ing, учитывая мои звонки на rsGetElementAtYuv_uchar_U
и rsGetElementAtYuv_uchar_V
; Я подозреваю, что распределение ввода не объявлено правильно.
Вот мой RenderScript:
#pragma version(1)
#pragma rs java_package_name(com.enware.hwdgd)
#pragma rs_fp_relaxed
rs_allocation gIn;
uchar2 RS_KERNEL yuv_to_rgb565_frames(uint32_t x, uint32_t y)
{
uchar yC = rsGetElementAtYuv_uchar_Y(gIn, x, y);
uchar uC = rsGetElementAtYuv_uchar_U(gIn, x, y);
uchar vC = rsGetElementAtYuv_uchar_V(gIn, x, y);
uchar4 rgb = rsYuvToRGBA_uchar4(yC, uC, vC);
uchar2 out = rgb.r << 11 | rgb.g << 5 | rgb.b;
return out;
}
... и вот мое расширение Image, которое вызывает вышеупомянутый RenderScript:
private fun Image.toFaceDetectorBitmap(
renderScript: RenderScript,
script: ScriptC_yuv_to_rgb565
): Bitmap {
val source = Allocation.createTyped(
renderScript,
Type.createXY(
renderScript,
Element.createPixel(
renderScript,
Element.DataType.UNSIGNED_8,
Element.DataKind.PIXEL_YUV
),
this.width,
this.height
)
)
val targetBitmap = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.RGB_565)
val target = Allocation.createTyped(
renderScript,
Type.createXY(renderScript, Element.U8_2(renderScript), this.width, this.height)
)
val yBuffer = planes[0].buffer
val uBuffer = planes[1].buffer
val vBuffer = planes[2].buffer
val yuvBuffer =
ByteBuffer.allocate(yBuffer.remaining() + uBuffer.remaining() + vBuffer.remaining())
.put(yBuffer)
.put(uBuffer)
.put(vBuffer)
source.copyFrom(yuvBuffer.flip().array())
script._gIn = source
script.forEach_yuv_to_rgb565_frames(target)
targetBitmap.copyPixelsFromBuffer(target.byteBuffer)
source.destroy()
target.destroy()
return targetBitmap
}
Я видел несколько свернутых вручную примеров YUV RenderScript , но я думаю, что я смогу использовать существующие внутренние свойства Android.
Спасибо за любые помощь.