Я пишу приложение, которое требует от меня разбить большое изображение на маленькие плитки, где каждая плитка по существу является обрезанной версией исходного изображения.обрезать изображение без копирования
В настоящее время мой раскол операция выглядит примерно так
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 секунды при расщеплении приличного размер изображения).
Я немного огляделся, но не смог найти способ рисовать растровое изображение как суб-прямоугольник большого изображения без копирования каких-либо данных. Какие-либо предложения?
Вы пробовали создать новый 'Bitmap' и блиттинг в него? Я думаю, что это может быть быстрее, чем пытаться обрезать изображение inline. –
Ваш класс 'tile' может хранить ссылку на исходное изображение и прямоугольник для копирования при рисовании? Graphics.DrawImage имеет перегрузки для рисования части растрового изображения: http://msdn.microsoft.com/en-us/library/3tf158xz.aspx – Blorgbeard
Я, по общему признанию, не специалист по обработке изображений, но я не уверен то, что вы просите, имеет смысл. Хотя может быть механизм скрыть копию, я подозреваю, что данные изображения должны быть «перестроены» (скопированы) в память в любом случае. – svidgen