Я пишу видеоплеер для воспроизведения кадров, снятых нашей ASIC. Они в произвольном формате, и мне была предоставлена функция, которая декодирует состояния ASIC. Видео может быть любого размера от 640х480 до 2560х1200 (!!!). Выходные данные каждого цикла состояния составляют 16x16 блоков пикселей, которые я должен вставить в видео на экране.
Каждый раз, когда необходимо обновить экран, у меня есть следующая информация:
- Ширина блока
- Высота блока
- X координата начала блока
- Координата Y начала блока
- 1-D массив информации о цвете пикселей RGB32
Основные ограничения:
- .NET 3.5
- Нет небезопасного кода
Я провел это утро, пробуя 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-сцены в растровое изображение. Предложения здесь?