Я пишу видеопроигрыватель для воспроизведения кадров, захваченных нашим ASIC. Они имеют специальный формат, и мне предоставили функцию, которая декодирует состояния ASIC. Видео может быть любого размера от 640х480 до 2560х1200 (!!!). Результатом каждого цикла состояний являются блоки пикселей размером 16x16, которые я должен вставить в видео на экране.
Каждый раз, когда экран требует обновления, у меня есть следующая информация:
Основные ограничения:
Сегодня утром я пробовал WriteableBitmap и использовал его в качестве источника изображения, примерно так:
private WriteableBitmap ImageSource;
public MainWindow()
{
InitializeComponent();
ImageSource = new WriteableBitmap(FrameWidth, FrameHeight, 96, 96, PixelFormats.Bgr32, null);
ImagePanel.Source = ImageSource;
}
private void DrawBox(byte Red, byte Green, byte Blue, int X, int Y)
{
int BoxWidth = 16;
int BoxHeight = 16;
int BytesPerPixel = ImageSource.Format.BitsPerPixel / 8;
byte[] Pixels = new byte[BoxWidth * BoxHeight * BytesPerPixel];
for (int i = 0; i < Pixels.Length; i += 4)
{
Pixels[i + 0] = Blue;
Pixels[i + 1] = Green;
Pixels[i + 2] = Red;
Pixels[i + 3] = 0;
}
int Stride = BoxWidth * BytesPerPixel;
Int32Rect DrawBox = new Int32Rect(X, Y, BoxWidth, BoxHeight);
ImageSource.Lock();
ImageSource.WritePixels(DrawBox, Pixels, Stride, 0);
ImageSource.Unlock();
}
Это работает, мое видео воспроизводится на экране, но медленнооооооооо . И даже близко к скорости воспроизведения в реальном времени. Есть ли лучший способ, помимо процедурного создания серии растровых изображений, сделать это, чего я не вижу? Я кое-что читал о D3Dimage, но, похоже, это больше для экспорта 3D-сцены в растровое изображение. Есть предложения?