2013-03-26 18 views
5

Sto scrivendo un'applicazione che richiede di suddividere un'immagine di grandi dimensioni in piccole tessere, in cui ogni riquadro è essenzialmente una versione ritagliata dell'immagine originale.immagine di ritaglio senza copiare

Attualmente la mia operazione di divisione simile a questa

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(); 

Intuitivamente, ho pensato che questo creerebbe in pratica un "riferimento" per l'immagine originale, e sarebbe solo visualizzato come un sub rettangolare dell'immagine. Tuttavia, la lenta velocità con cui viene eseguita la mia operazione di split mi ha portato a credere che questo è in realtà copiando il rect sorgente dell'immagine originale, che è molto lento per le immagini di grandi dimensioni (C'è una pausa di 3-4 secondi notevole quando si divide un decente dimensione immagine).

mi sono guardato intorno un po ', ma non sono stati in grado di trovare un modo per disegnare una bitmap come un sub rect di un'immagine di grandi dimensioni, senza copiare tutti i dati. Eventuali suggerimenti?

+0

Avete provato a generare un nuovo 'Bitmap' e copiarlo sul video in esso? Penso che potrebbe essere più veloce di cercare di ritagliare l'immagine in linea. –

+0

La tua classe 'tile' potrebbe memorizzare un riferimento all'immagine originale e un rettangolo da copiare quando si disegna da solo? Graphics.DrawImage ha sovraccarichi per disegnare una porzione di una bitmap: http://msdn.microsoft.com/en-us/library/3tf158xz.aspx – Blorgbeard

+0

Non sono certo un esperto di manipolazione delle immagini, ma non sono sicuro quello che stai chiedendo ha senso. Mentre potrebbe esserci un meccanismo per nascondere la copia, sospetto che i dati dell'immagine debbano essere "riallineati" (copiati) nella memoria in entrambi i casi. – svidgen

risposta

4

utilizzare la classe 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

In precedenza ho commentato che questo non ha aumentato le prestazioni di molto, ma ho appena provato di nuovo il vecchio modo e questo in effetti produce un significativo aumento di prestazioni (da circa 6 secondi a uno split a più come 1 secondo). – phosphoer

Problemi correlati