3

我有以下代码,我在 xamarin android 中创建 ImageReader 实例,如何将图像格式从更改ImageFormatType.Rgb565PixelFormat.RGBA_8888

我无法找到它的库或枚举类。

mImageReader = ImageReader.NewInstance(windowWidth, windowHeight, ImageFormatType.Rgb565, 2)
4

3 回答 3

0

In Xamarin, its Format.Rgba8888 (lower case). the doc is here

于 2018-11-11T22:21:43.020 回答
0

另一种选择是使用这个

var imageReader = ImageReader.NewInstance(_mWidth, _mHeight, (ImageFormatType)Format.Rgba8888, 2);

它对我有用。

于 2021-08-23T15:31:19.147 回答
0

您需要将3( Android.Graphics.Format.Rgb888) 的 int 值传递给ImageReader.NewInstance,但目前您不能。

这是 Xamarin.Android 自动生成 API 过程中的错误/问题,因为它们不会创建接受Android.Graphics.Format枚举的重载,或者只是int像 Java API 那样简单。

您可以通过 Xamarin.Android 绑定到 Android.Runtime.JNIEnv 或 Java.Lang.Reflect 在 Java 中执行此操作

使用 JNI 的示例:

注意:使用 JNI 需要允许程序集使用“不安全”代码(从好的方面来说,JNI 的执行速度比使用反射要快......)

public static class ImageReaderEx
{
    public unsafe static ImageReader NewInstance(int width, int height, Android.Graphics.Format format, int maxImages)
    {
        JniArgumentValue* ptr = stackalloc JniArgumentValue[4];
        *ptr = new JniArgumentValue(width);
        ptr[1] = new JniArgumentValue(height);
        ptr[2] = new JniArgumentValue((int)format);
        ptr[3] = new JniArgumentValue(maxImages);
        JniPeerMembers _members = new XAPeerMembers("android/media/ImageReader", typeof(ImageReader));
        return Java.Lang.Object.GetObject<ImageReader>(_members.StaticMethods.InvokeObjectMethod("newInstance.(IIII)Landroid/media/ImageReader;", ptr).Handle, JniHandleOwnership.TransferLocalRef);
    }

    public unsafe static ImageReader NewInstance(int width, int height, int format, int maxImages)
    {
        JniArgumentValue* ptr = stackalloc JniArgumentValue[4];
        *ptr = new JniArgumentValue(width);
        ptr[1] = new JniArgumentValue(height);
        ptr[2] = new JniArgumentValue(format);
        ptr[3] = new JniArgumentValue(maxImages);
        JniPeerMembers _members = new XAPeerMembers("android/media/ImageReader", typeof(ImageReader));
        return Java.Lang.Object.GetObject<ImageReader>(_members.StaticMethods.InvokeObjectMethod("newInstance.(IIII)Landroid/media/ImageReader;", ptr).Handle, JniHandleOwnership.TransferLocalRef);
    }
}

用法:

var imageReader = ImageReaderEx.NewInstance(1, 1, 3, 1);

或者

var ImageReader = ImageReaderEx.NewInstance(1, 1, Android.Graphics.Format.Rgb888, 1);
于 2018-11-11T22:29:46.250 回答