无法找到适用于Xamarin Android的PixelFormat枚举

时间:2018-11-11 21:54:01

标签: android xamarin bitmap xamarin.android image-reader

我在xamarin android中创建ImageReader实例的代码如下,如何将图像格式从ImageFormatType.Rgb565更改为PixelFormat.RGBA_8888

我找不到它的库或枚举类。

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

2 个答案:

答案 0 :(得分:0)

在Xamarin中,其Format.Rgba8888(小写)。该文档是here

答案 1 :(得分:0)

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

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

通过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);