2013-03-26 16 views
5

Я пишу приложение, которое требует от меня разбить большое изображение на маленькие плитки, где каждая плитка по существу является обрезанной версией исходного изображения.обрезать изображение без копирования

В настоящее время мой раскол операция выглядит примерно так

tile.Image = new BitmapImage(); 
tile.Image.BeginInit(); 
tile.Image.UriSource = OriginalImage.UriSource; 
tile.Image.SourceRect = new Int32Rect(x * tileWidth + x, y * tileHeight, tileWidth, tileHeight); 
tile.Image.EndInit(); 

Наглядно, я думал, что это создало бы в основном «ссылку» на оригинальное изображение, и просто показать, как к югу от прямоугольника изображения. Тем не менее, медленная скорость, с которой выполняется моя операция разделения, привела меня к мысли, что на самом деле это копирует исходный прямоугольник исходного изображения, который очень медленный для больших изображений (есть заметная пауза в 3-4 секунды при расщеплении приличного размер изображения).

Я немного огляделся, но не смог найти способ рисовать растровое изображение как суб-прямоугольник большого изображения без копирования каких-либо данных. Какие-либо предложения?

+0

Вы пробовали создать новый 'Bitmap' и блиттинг в него? Я думаю, что это может быть быстрее, чем пытаться обрезать изображение inline. –

+0

Ваш класс 'tile' может хранить ссылку на исходное изображение и прямоугольник для копирования при рисовании? Graphics.DrawImage имеет перегрузки для рисования части растрового изображения: http://msdn.microsoft.com/en-us/library/3tf158xz.aspx – Blorgbeard

+0

Я, по общему признанию, не специалист по обработке изображений, но я не уверен то, что вы просите, имеет смысл. Хотя может быть механизм скрыть копию, я подозреваю, что данные изображения должны быть «перестроены» (скопированы) в память в любом случае. – svidgen

ответ

4

Используйте класс System.Windows.Media.Imaging.CroppedBitmap:

// Create a CroppedBitmap from the original image. 
Int32Rect rect = new Int32Rect(x * tileWidth + x, y * tileHeight, tileWidth, tileHeight); 
CroppedBitmap croppedBitmap = new CroppedBitmap(originalImage, rect); 

// Create an Image element. 
Image tileImage = new Image(); 
tileImage.Width = tileWidth; 
tileImage.Height = tileHeight; 
tileImage.Source = croppedBitmap; 
+1

Раньше я прокомментировал, что это не так сильно увеличило производительность, но я просто попробовал старый способ снова, и на самом деле это дает значительное увеличение производительности (с близкого к 6 секундам для разделения до более 1 секунды). – phosphoer

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