Преобразование C# UWP из System.IO.Stream в Windows.Storage.Streams.IRandomAccessStreamWithContentType

поэтому я пытаюсь получить IRandomAccessStreamWithContentType, но не могу, потому что получаю исключение:

"This IRandomAccessStream does not support the CloneStream method because it requires cloning and this stream does not support cloning."

И это происходит в последней строке следующего кода:

PixelDataProvider pix = await decoder.GetPixelDataAsync(
                BitmapPixelFormat.Bgra8,
                BitmapAlphaMode.Straight,
                transform,
                ExifOrientationMode.IgnoreExifOrientation,
                ColorManagementMode.ColorManageToSRgb);
byte[] pixels = pix.DetachPixelData();

Stream pixStream = cropBmp.PixelBuffer.AsStream();
pixStream.Write(pixels, 0, (int)(width * height * 4));
IRandomAccessStream iStream= pixStream.AsRandomAccessStream(); //dafaq with streams
RandomAccessStreamReference iReferenceStream= RandomAccessStreamReference.CreateFromStream(iStream);
IRandomAccessStreamWithContentType newStream = await iReferenceStream.OpenReadAsync();

Есть ли обходной путь или что-то в этом роде?

Изменить 1

Я также пробовал этот способ, все еще не работает. (Но теперь я получаю ноль, а не то, что клон не удался)

InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
await ras.WriteAsync(pixels.AsBuffer());
RandomAccessStreamReference iReferenceStream = RandomAccessStreamReference.CreateFromStream(ras);
IRandomAccessStreamWithContentType newStream = await iReferenceStream.OpenReadAsync();

person user7827649    schedule 16.05.2017    source источник


Ответы (1)


Судя по вашему коду, вы использовали BitmapDecoder. BitmapDecoder обеспечивает доступ для чтения к данным контейнера растровых изображений, а также к данным из первого кадра.

У нас должна быть возможность создать новый InMemoryRandomAccessStream для кодировщика, чтобы он мог записывать и вызывать rel="nofollow noreferrer">BitmapEncoder.CreateForTranscodingAsync, передавая поток в памяти и объект декодера.

Например:

Windows.Storage.Streams.IRandomAccessStream random = await Windows.Storage.Streams.RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/sunset.jpg")).OpenReadAsync();
Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(random);
Windows.Graphics.Imaging.PixelDataProvider pixelData = await decoder.GetPixelDataAsync();
byte[] buffer = pixelData.DetachPixelData();
InMemoryRandomAccessStream inMemoryRandomAccessStream = new InMemoryRandomAccessStream();
BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryRandomAccessStream, decoder);
encoder.BitmapTransform.ScaledWidth = 320;
encoder.BitmapTransform.ScaledHeight = 240;
await encoder.FlushAsync();
inMemoryRandomAccessStream.Seek(0);
random.Seek(0);
BitmapImage bitmapImage = new BitmapImage();
RandomAccessStreamReference iReferenceStream = RandomAccessStreamReference.CreateFromStream(inMemoryRandomAccessStream);
IRandomAccessStreamWithContentType newStream = await iReferenceStream.OpenReadAsync();
bitmapImage.SetSource(newStream);
MyImage.Source = bitmapImage;
person Jayden    schedule 17.05.2017