【问题标题】:Unable to find PixelFormat Enum for Xamarin Android找不到 Xamarin Android 的 PixelFormat 枚举
【发布时间】:2018-11-11 21:54:00
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您需要将 3 (Android.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);
    

    【讨论】:

    • 我应该使用哪个 jar 文件进行绑定?在哪里可以找到它们?
    • 不需要jar文件。
    • @VINNUSAURUS 没有jar文件,只是通过Java反射或JNI,如果你不知道怎么做,我可以稍后帮你写代码(不是在我的电脑上)
    • 你能告诉我怎么做吗,因为我看不懂,我是新手,我会等待代码。
    • @VINNUSAURUS 我添加了一个例子
    【解决方案2】:

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

    【讨论】:

    • 这不起作用,因为 ImageReader.NewInstance 不接受 Format 枚举作为参数,这是自动生成的 API 绑定中的问题...
    【解决方案3】:

    另一种选择是使用this

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

    它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      相关资源
      最近更新 更多