WPF эквивалент Bitmap.LockBits - PullRequest
2 голосов
/ 10 мая 2011

У меня есть следующий рабочий код в приложении Win Forms:

Bitmap bitmap = new Bitmap(imageWidth, imageHeight, PixelFormat.Format32bppArgb);
Rectangle rect = new Rectangle(0, 0, imageWidth, imageHeight);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

Tao.DevIl.Il.ilConvertImage(Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE);
Tao.DevIl.Il.ilCopyPixels(0, 0, 0, imageWidth, imageHeight, 1, Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE, bitmapData.Scan0);

bitmap.UnlockBits(bitmapData);

Я хотел бы преобразовать этот код, чтобы он был совместим с WPF и отображался в пользовательском интерфейсе. Это означает, что мне, вероятно, придется преобразовать System.Drawing.Bitmap в System.Windows.Media.Imaging.BitmapImage.

Однако, вместо того, чтобы конвертировать между ними, мне было интересно, есть ли более быстрый / прямой способ сделать это? Как делать что-то вроде LockBits () на BitmapImage.

ilCopyPixels () принимает IntPtr в качестве последнего барама. В старом коде я получаю эту форму BitmapData.Scan0.

Edit:

Благодаря ответу Эрно я придумал следующее:

WriteableBitmap bitmap = new WriteableBitmap(imageWidth, imageHeight, 96, 96, PixelFormats.Bgra32, null);
bitmap.Lock();
Tao.DevIl.Il.ilCopyPixels(0, 0, 0, imageWidth, imageHeight, 1, Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE, bitmap.BackBuffer);
bitmap.Unlock();

Однако, когда я устанавливаю растровое изображение в качестве источника изображения, я ничего не вижу. Я не получаю никаких исключений.

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Посмотрите на WriteableBitmap , он позаботится о большинстве этих деталей.

0 голосов
/ 11 мая 2011

Текущее временное исправление, которое у меня есть, - преобразование растрового изображения в растровый источник с использованием следующего кода:

Bitmap bitmap = new Bitmap(imageWidth, imageHeight, PixelFormat.Format32bppArgb);
Rectangle rect = new Rectangle(0, 0, imageWidth, imageHeight);
BitmapData bitmapData = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);

Tao.DevIl.Il.ilCopyPixels(0, 0, 0, imageWidth, imageHeight, 1, Tao.DevIl.Il.IL_BGRA, Tao.DevIl.Il.IL_UNSIGNED_BYTE, bitmapData.Scan0);
Tao.DevIl.Il.ilDeleteImages(1, ref imageId);

bitmap.UnlockBits(bitmapData);

using (MemoryStream str = new MemoryStream())
{
    bitmap.Save(str, ImageFormat.Bmp);
    str.Seek(0, SeekOrigin.Begin);
    BitmapDecoder bdc = new BmpBitmapDecoder(str, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
    // Retrieve the BitmapSource
    image1.Source = bdc.Frames[0];
}

Очевидно, я бы предпочел создать BitmapSource напрямую, без дополнительных затрат на создание Bitmap в первую очередь. Любые предложения по-прежнему приветствуются!

...