Создать суб-растровое изображение из SoftwareBitmap в C # - PullRequest
0 голосов
/ 04 июня 2018

Итак, для начала вот что я пытаюсь сделать: https://forums.hololens.com/discussion/3263/zxing-unity-barcode-dll-issue

На самом деле, у меня та же цель, что и у автора поста, но я не согласен с некоторыми изего заключение, особенно об использовании UWP.Он решил работать с веб-камерой Unity, а я решил работать с UWP-инфраструктурой, которая, IMO, лучше работает с меньшим количеством падений FPS в приложениях AR.

Но некоторые его подходы действительно интересны, особенно его работас квадрантом.Я пытаюсь воспроизвести его с помощью технологии UWP, и у меня возникли некоторые проблемы.

Я уже прочитал каждый пост о том, как создать суб-растровое изображение, но каждое решение использует библиотеку растровых изображений (System.Drawing), в то время какДанный формат является программным битмапом.Я пытался воссоздать растровое изображение с необработанным массивом (я могу получить его из моего softwareBitmap), но, похоже, это чушь.

Итак, вот мой вопрос: есть ли способ воссоздать этот квадрантПонятие о модели программного обеспечения Bitmap?Как бы то ни было, каждое решение хорошо (растровое изображение, необработанный массив и т. Д.)

Вот пример кода, который я использовал для zxing, и я буду модифицирован для интеграции сканирования квадрантов:

private void ColorFrameReader_FrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
{
    var mediaFrameReference = sender.TryAcquireLatestFrame();
    var videoMediaFrame = mediaFrameReference?.VideoMediaFrame;
    var softwareBitmap = videoMediaFrame?.SoftwareBitmap;

    if (softwareBitmap != null)
    {
        if (softwareBitmap.BitmapPixelFormat != Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8 ||
        softwareBitmap.BitmapAlphaMode != Windows.Graphics.Imaging.BitmapAlphaMode.Premultiplied)
        {
            softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);

        }
        softwareBitmap.CopyToBuffer(buffer);
        buffer2 = buffer.ToArray();

        result = DecodeBufferToQRCode(buffer2, softwareBitmap.PixelWidth, softwareBitmap.PixelHeight, BitmapFormat.BGRA32);          
        if(result != null)
        {
            print("Call send to zxing, result : " + result.Text);
        }
        else
        {

        }
    }
    mediaFrameReference.Dispose();
}

Заранее спасибо,

Shad

1-е РЕДАКТИРОВАНИЕ: Возможно, у меня есть решение, основанное на манипулировании строками в массиве byte [], которое я могу получить из softwareBitmap, но, похоже,чтобы быть действительно тяжелым, с точки зрения процессора и памяти для Гололенса.Итак, я думаю, что нативное решение (с растровым изображением) все равно будет лучше, если у кого-то оно есть.

Решение использует эту структуру

//                                      3 | 4
List<byte[]> subImages; // the order is 1 | 2 in the list (so 1 is the inferior left corner of the pict)

с таким кодом

//Code used for picture splitting and decoding.
void imageProcess(byte[] image)
{   
    for(int i =0; i<= image.Length; i++)
    {
        if(i%resW < halfresW && i%resH < halfresH) //1
        {

        }else if (i % resW < halfresW && i % resH > halfresH)//3
        {

        }else if (i % resW > halfresW && i % resH < halfresH)//2
        {

        }
        else//4
        {

        }
    }

    //Then, process each


}

Но в этот момент я совершенно растерялся: хотя в моем растровом изображении используется 32bpp (RGBA), я должен умножить на 4 все мои характеристики массива (разрешение и половину разрешения)?

...