从C#中的SoftwareBitmap创建子位图

时间:2018-06-04 08:35:07

标签: c# bitmap uwp hololens

所以,首先,我要做的是:https://forums.hololens.com/discussion/3263/zxing-unity-barcode-dll-issue

事实上,我的目标与帖子的作者相同,但我不同意他的一些结论,特别是关于UWP的用法。他选择使用Unity网络摄像头,我选择使用UWP框架,IMO可以更好地工作,减少AR应用程序的FPS下降。

但他的一些方法非常有趣,尤其是他与象限的合作。我正试图用UWP技术重现它,并且有一些问题。

我已经阅读了有关如何创建子Bitmap的每篇文章,但每个解决方案都使用Bitmap库(System.Drawing),而给定的格式是softwareBitmap。我尝试重新创建一个原始数组的Bitmap(我可以从我的softwareBitmap中获取它),但它似乎是crapy。

所以,这是我的问题:有没有办法在softwareBitmap模型上重新创建这个象限概念?无论如何,每个解决方案都很好(位图,原始数组等......)

以下是我用于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();
}

提前致谢,

沙德

第一次编辑:我可能有一个基于byte []数组上的行操作的解决方案,我可以从softwareBitmap中检索,但就Hololens的CPU和内存而言,它看起来真的很重。因此,我认为如果有人拥有它,原生解决方案(使用Bitmap)仍然会更好。

解决方案使用此结构

//                                      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


}

但是在这一点上,我很丢失:当我的Bitmap使用32bpp(RGBA)时,我应该将所有数组统计数据(分辨率和半分辨率)乘以4吗?

0 个答案:

没有答案