Невозможно найти PixelFormat Enum для Android Xamarin
У меня есть код ниже, где я создаю экземпляр ImageReader в xamarin Android, как изменить формат изображения с ImageFormatType.Rgb565
в PixelFormat.RGBA_8888
я не могу найти библиотеку или класс Enum для него.
mImageReader = ImageReader.NewInstance(windowWidth, windowHeight, ImageFormatType.Rgb565, 2)
3 ответа
Вам нужно передать значение int 3
(Android.Graphics.Format.Rgb888
) чтобы ImageReader.NewInstance
, но в настоящее время вы не можете.
Это ошибка / проблема в процессе API автоматической генерации Xamarin.Android, так как они не создают перегрузку, которая принимает Android.Graphics.Format
enum или просто int
как API Java делает.
Вы можете сделать это так же, как в Java через привязку Xamarin.Android к Android.Runtime.JNIEnv или Java.Lang.Reflect.
Пример использования 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);
В Xamarin его Format.Rgba8888
(нижний регистр). документ здесь
Другой вариант - использовать это :
var imageReader = ImageReader.NewInstance(_mWidth, _mHeight, (ImageFormatType)Format.Rgba8888, 2);
У меня это работает.