2012-05-14 3 views
1

Мне нужно сохранить мой FrameworkElement как очень большое растровое изображение. Сейчас я использую RenderTargetBitmap класс и BitmapEncoder, таким образом:Как сохранить FrameworkElement как очень большое растровое изображение?

RenderTargetBitmap bmp = new RenderTargetBitmap(ElementWidth, ElementHeight, 
    90, 96, PixelFormats.Default); 

bmp.Render(MyElement); // OutOfMemoryException here 

PngBitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(bmp)); 

using (var stream = File.Create(filePath)) 
{ encoder.Save(stream); } 

Где ElementWidth и ElementHeight большое число (около 10000x6000). Но с этим решением есть исключение OutOfMemoryException, когда я пытаюсь выполнить Render мой элемент.

Есть ли другие способы делать то, что мне нужно (не вызывая исключения OutOfMemoryException)? Спасибо.

ответ

1

В этом случае вам нужно будет отобразить FrameworkElement в плитке. Самый простой способ сделать это - установить свойство Clip в положение/размер плитки, которую вы хотите визуализировать, а затем использовать экземпляр RenderTargetBitmap размера Tile размером, чтобы получить эту часть на диске. Теперь вы можете либо

  1. Оставьте куски, как есть, и использовать их в какой-то deep-zoom type tiled renderer
  2. Объединить их всех (обратите внимание, что, если они не укладывались в памяти, чтобы сделать в первую очередь, вы можете 't load' em all to combination, либо), используя ImageMagick's command line/large image support, либо сделайте это самостоятельно, проанализировав формат файла, а затем напишите правильный выходной файл.

Конечно, я не знаю, поможет ли вариант 2, потому что даже если вы пишете огромный выходной файл - как он будет загружать его? :)

Надеюсь, это поможет!

Смежные вопросы