Создайте и измените размер изображения в WPF из областей System.Drawing.Bitmap. - PullRequest
0 голосов
/ 08 февраля 2011

Я пытаюсь реализовать функцию, которая принимает объект System.Drawing.Bitmap и отображает его на холсте WPF. Растровое изображение должно быть обрезано и соединено несколько раз перед рендерингом.

Среда : приложение WPF, работающее в .NET 3.5 SP1

Ввод : объект System.Drawing.Bitmap, размером 800x600 и пиксельным форматом RGB24

Цель : отобразить изображение, состоящее из двух полос входного растрового изображения (в одну строку). Полосы представляют собой две половины растрового изображения - (0,0 800 300) и (0,300 800 600). Позже я хочу иметь возможность масштабировать изображение вверх или вниз.

Я уже реализовал решение с использованием GDI и Graphics.DrawImage (которое отображается в растровом объекте), но я хочу повысить производительность (эту функцию можно вызывать 30 раз в секунду).

Есть ли более быстрый способ реализовать это с WPF, если я хочу визуализировать изображение в окне WPF?

1 Ответ

0 голосов
/ 09 февраля 2011

Лучшее решение, которое я нашел на данный момент, это использование WriteableBitmap, что-то вроде этого:

void Init()
{
    m_writeableBitmap = new WriteableBitmap(DesiredWidth, DesiredHeight, DesiredDpi, DesiredDpi, PixelFormats.Pbgra32, null);
{

void CopyPixels(System.Drawing.Bitmap frame, Rectangle source, Point destBegin)
{
    var bmpData = frame.LockBits(source, ImageLockMode.ReadOnly, frame.PixelFormat);
    m_writeableBitmap.Lock();

    var dest = new Int32Rect(destBegin.X, destBegin.Y, bmpData.Width, bmpData.Height);
    m_writeableBitmap.WritePixels(dest, bmpData.Scan0, bmpData.Stride * bmpData.Height, bmpData.Stride);

    m_writeableBitmap.Unlock();
    frame.UnlockBits(bmpData);
}

CopyPixels будет вызываться дважды для случая использования, который я описал в моем вопросе (две полосы).

...