Невозможно найти 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);

У меня это работает.

Другие вопросы по тегам