private async void button_Click(object sender, RoutedEventArgs e) { var picker = new Windows.Storage.Pickers.FileOpenPicker(); picker.FileTypeFilter.Add(".jpg"); var file = await picker.PickSingleFileAsync(); Lumia.Imaging.BitmapRenderer renderer = new Lumia.Imaging.BitmapRenderer(); renderer.ColorMode = Lumia.Imaging.ColorMode.Yuv420P; renderer.Source = new Lumia.Imaging.StorageFileImageSource(file); var bmp = await renderer.RenderAsync(); var surfaceImageSource = new SurfaceImageSource((int)bmp.Dimensions.Width, (int)bmp.Dimensions.Height); var yuvRenderer = YuvRenderer.YuvD3DRenderer.CreateForSwapChainPanel(root, (uint)bmp.Dimensions.Width, (uint)bmp.Dimensions.Height, YuvRenderer.StretchMode.UniformToFill); Task.Run(() => { //// convert to nv12. //var yReader = DataReader.FromBuffer(bmp.Buffers[0].Buffer); //var uReader = DataReader.FromBuffer(bmp.Buffers[1].Buffer); //var vReader = DataReader.FromBuffer(bmp.Buffers[2].Buffer); //byte[] yData = new byte[bmp.Buffers[0].Buffer.Length]; //byte[] uData = new byte[bmp.Buffers[1].Buffer.Length]; //byte[] vData = new byte[bmp.Buffers[2].Buffer.Length]; //yReader.ReadBytes(yData); //uReader.ReadBytes(uData); //vReader.ReadBytes(vData); //var height = (int)(bmp.Dimensions.Height); //var halfWidth = ((int)(bmp.Dimensions.Width)) / 2; //var halfHeight = height / 2; //var heightAndHalf = height + halfHeight; //var nv12Data = new byte[bmp.Buffers[0].Pitch * heightAndHalf]; //Array.Copy(yData, nv12Data, yData.Length); //Parallel.For(0, halfHeight, y => //{ // var firstPixelOfRow = yData.Length + y * bmp.Buffers[0].Pitch; // for (int x = 0; x < halfWidth; ++x) // { // nv12Data[x * 2 + firstPixelOfRow] = uData[y * bmp.Buffers[1].Pitch + x]; // nv12Data[x * 2 + firstPixelOfRow + 1] = vData[y * bmp.Buffers[2].Pitch + x]; // } //}); while (true) { yuvRenderer.RenderYuv420P(bmp.Buffers[0].Buffer, bmp.Buffers[1].Buffer, bmp.Buffers[2].Buffer, bmp.Buffers[0].Pitch, bmp.Buffers[1].Pitch); } }); }
internal async void ContinuePick(StorageFile file) { Lumia.Imaging.BitmapRenderer renderer = new Lumia.Imaging.BitmapRenderer(); renderer.ColorMode = Lumia.Imaging.ColorMode.Yuv420P; renderer.Source = new Lumia.Imaging.StorageFileImageSource(file); var bmp = await renderer.RenderAsync(); var surfaceImageSource = new SurfaceImageSource((int)bmp.Dimensions.Width, (int)bmp.Dimensions.Height); var yuvRenderer = YuvRenderer.YuvD3DRenderer.CreateForSwapChainPanel(root, (uint)bmp.Dimensions.Width, (uint)bmp.Dimensions.Height, YuvRenderer.StretchMode.Uniform); Task.Run(() => { // convert to nv12. var yReader = DataReader.FromBuffer(bmp.Buffers[0].Buffer); var uReader = DataReader.FromBuffer(bmp.Buffers[1].Buffer); var vReader = DataReader.FromBuffer(bmp.Buffers[2].Buffer); byte[] yData = new byte[bmp.Buffers[0].Buffer.Length]; byte[] uData = new byte[bmp.Buffers[1].Buffer.Length]; byte[] vData = new byte[bmp.Buffers[2].Buffer.Length]; yReader.ReadBytes(yData); uReader.ReadBytes(uData); vReader.ReadBytes(vData); var height = (int)(bmp.Dimensions.Height); var halfWidth = ((int)(bmp.Dimensions.Width)) / 2; var halfHeight = height / 2; var heightAndHalf = height + halfHeight; var nv12Data = new byte[bmp.Buffers[0].Pitch * heightAndHalf]; Array.Copy(yData, nv12Data, yData.Length); for (int y = 0; y < halfHeight; ++y) { var firstPixelOfRow = yData.Length + y * bmp.Buffers[0].Pitch; for (int x = 0; x < halfWidth; ++x) { nv12Data[x * 2 + firstPixelOfRow] = uData[y * bmp.Buffers[1].Pitch + x]; nv12Data[x * 2 + firstPixelOfRow + 1] = vData[y * bmp.Buffers[2].Pitch + x]; } } while (true) { yuvRenderer.RenderNV12(nv12Data, bmp.Buffers[0].Pitch); } }); }