Не удается найти PixelFormat Enum для Android Xamarin - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть код ниже, где я создаю экземпляр ImageReader в xamarin android, как изменить формат изображения с ImageFormatType.Rgb565 на PixelFormat.RGBA_8888

Я не могу найти библиотеку или класс Enum для него.

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

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вам нужно передать значение типа 3 (Android.Graphics.Format.Rgb888) в ImageReader.NewInstance, но в настоящее время вы не можете.

Это ошибка / проблема в процессе API автоматической генерации Xamarin.Android, так как они не создают перегрузку, которая принимает перечисление Android.Graphics.Format или просто 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);
0 голосов
/ 12 ноября 2018

В Xamarin это Format.Rgba8888 (нижний регистр). документ здесь

...