无法找到 Xamarin 的 PixelFormat 枚举 Android
Unable to find PixelFormat Enum for Xamarin Android
我有下面的代码,我在 xamarin android 中创建一个 ImageReader 实例,如何将图像格式从 ImageFormatType.Rgb565
更改为 PixelFormat.RGBA_8888
我找不到它的库或枚举 class。
mImageReader = ImageReader.NewInstance(windowWidth, windowHeight, ImageFormatType.Rgb565, 2)
在 Xamarin 中,它是 Format.Rgba8888
(小写)。文档是 here
您需要将 3
(Android.Graphics.Format.Rgb888
) 的 int 值传递给 ImageReader.NewInstance
,但目前您不能。
这是 Xamarin.Android 自动生成 API 过程中的 bug/issue,因为它们不会创建接受 Android.Graphics.Format
枚举的重载,或者只是一个普通的 int
和 Java API 一样。
您可以通过 Xamarin.Android 绑定到 Android.Runtime.JNIEnv 或 Java.Lang.Reflect
,以与在 Java 中相同的方式执行此操作
使用 JNI 的示例:
注意:使用 JNI 需要允许程序集使用 "unsafe" 代码(从好的方面来说,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);
另一种选择是使用 this:
var imageReader = ImageReader.NewInstance(_mWidth, _mHeight, (ImageFormatType)Format.Rgba8888, 2);
对我有用。
我有下面的代码,我在 xamarin android 中创建一个 ImageReader 实例,如何将图像格式从 ImageFormatType.Rgb565
更改为 PixelFormat.RGBA_8888
我找不到它的库或枚举 class。
mImageReader = ImageReader.NewInstance(windowWidth, windowHeight, ImageFormatType.Rgb565, 2)
在 Xamarin 中,它是 Format.Rgba8888
(小写)。文档是 here
您需要将 3
(Android.Graphics.Format.Rgb888
) 的 int 值传递给 ImageReader.NewInstance
,但目前您不能。
这是 Xamarin.Android 自动生成 API 过程中的 bug/issue,因为它们不会创建接受 Android.Graphics.Format
枚举的重载,或者只是一个普通的 int
和 Java API 一样。
您可以通过 Xamarin.Android 绑定到 Android.Runtime.JNIEnv 或 Java.Lang.Reflect
,以与在 Java 中相同的方式执行此操作使用 JNI 的示例:
注意:使用 JNI 需要允许程序集使用 "unsafe" 代码(从好的方面来说,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);
另一种选择是使用 this:
var imageReader = ImageReader.NewInstance(_mWidth, _mHeight, (ImageFormatType)Format.Rgba8888, 2);
对我有用。