Составьте два растровых изображения с System.Windows.Media.Imaging - PullRequest
2 голосов
/ 23 ноября 2010

Я пытаюсь использовать System.Windows.Media.Imaging для объединения двух растровых изображений одинакового размера и формата в третий файл того же размера и формата. Я делаю это вне контекста WPF (работая над кодом в LINQPad), поскольку намерение состоит в том, чтобы превратить это в приложение ASP.net в качестве альтернативы неподдерживаемому System.Drawing.

// load the files
var layerOne = new BitmapImage(new Uri(layerOneFile, UriKind.Absolute));
var layerTwo = new BitmapImage(new Uri(layerTwoFile, UriKind.Absolute));

// create the destination based upon layer one
var composite = new WriteableBitmap(layerOne);

// copy the pixels from layer two on to the destination
int[] pixels = new int[(int)layerTwo.Width * (int)layerTwo.Height];
int stride = (int)(4 * layerTwo.Width);
layerTwo.CopyPixels(pixels, stride, 0);
composite.WritePixels(Int32Rect.Empty, pixels, stride, 0);

// encode the bitmap to the output file
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(composite));
using (var stream = new FileStream(outputFile, FileMode.Create))
{
    encoder.Save(stream);
}

Это создает файл, идентичный файлу, загруженному из layerOne, я ожидал, что layerTwo будет наложен на layerOne. Похоже, происходит то, что данные записываются в BackBuffer, но никогда не отображаются на растровом изображении ... возможно, это то, что обычно делает диспетчер.

Куда я иду не так? и как я могу вернуться на правильный путь?

1 Ответ

3 голосов
/ 23 ноября 2010

Проблема с первым аргументом для WritePixels, который указывает область WriteableBitmap для обновления.

Вместо Int32Rect.Empty вы можете сделать что-то вроде следующего и увидеть второе изображение, написанное поверх первого:

Int32Rect sourceRect = new Int32Rect(0, 0, (int)layerTwo.Width, (int)layerTwo.Height);
composite.WritePixels(sourceRect, pixels, stride, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...