Я работаю с приложением UWP. Я генерирую набор WriteableBitmap, и после этого я хочу добавить его в MediaComposition и воспроизводить в видеоплеере. Я нашел один способ, как это сделать, но он очень медленный. Вот мой код:
var clip = await MediaClip.CreateFromImageFileAsync(await
WriteableBitmapToStorageFile(wb), new TimeSpan(0, 0, 0, 0, 1));
(...)
private static async Task<StorageFile> WriteableBitmapToStorageFile(WriteableBitmap WB)
{
string FileName = "MyFile.";
Guid BitmapEncoderGuid = BitmapEncoder.TiffEncoderId;
FileName += "tiff";
var file = await Windows.Storage.ApplicationData.Current.TemporaryFolder
.CreateFileAsync(FileName, CreationCollisionOption.GenerateUniqueName);
using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoderGuid, stream);
Stream pixelStream = WB.PixelBuffer.AsStream();
byte[] pixels = new byte[pixelStream.Length];
await pixelStream.ReadAsync(pixels, 0, pixels.Length);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
(uint)WB.PixelWidth,
(uint)WB.PixelHeight,
96.0,
96.0,
pixels);
await encoder.FlushAsync();
}
return file;
}
Функция «WriteableBitmapToStorageFile» занимает почти 400 мсек, чтобы продолжить WriteableBitmap. Есть ли возможность сделать это быстрее? Я знаю, что MediaClip может быть создан из IDirect3DSurface, но я не знаю, как конвертировать в него из WriteableBitmap.
Хорошо, как сказал @Johnny Westlake, я использовал CanvasBitmap для рисования своих изображений. Но теперь после рисования многих изображений отображается только последнее изображение. Код:
public static CanvasDevice device = new CanvasDevice();
public static CanvasRenderTarget renderer = new CanvasRenderTarget(device, 2048, 1080, 96);
public static CanvasBitmap cb = CanvasBitmap.CreateFromBytes(device, new byte[64*64*4], 64, 64, Windows.Graphics.DirectX.DirectXPixelFormat.B8G8R8A8UIntNormalizedSrgb);
public static Rect dest = new Rect
{
Width = 2048,
Height = 1080
};
public static Rect src = new Rect
{
Width = 64,
Height = 64
};
private static CanvasBitmap GenerateHeatmap(byte[] renderedHeatmap )
{
cb.SetPixelBytes(renderedHeatmap);
using (var ds = renderer.CreateDrawingSession())
{
ds.DrawImage(cb, dest, src, 1, CanvasImageInterpolation.Cubic, CanvasComposite.Copy);
}
return renderer;
}
(...)
Позже в коде:
cb = GenerateHeatmap(renderedHeatmap);
MediaOverlay mediaOverlay = new MediaOverlay(MediaClip.CreateFromSurface(cb, new TimeSpan(0, 0, 0, 0, 1)));
mediaOverlay.Position = overlayPosition;
mediaOverlay.Opacity = heatmapOpacity;
return mediaOverlay;
После того, как я сделал это много раз, в конце в MediaOverlays было только одно изображение