2013-03-26 18 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'を作成し、その中に、ブリットしようとしたことがありますか?私はそれがイメージをインラインでトリミングしようとするよりも速いかもしれないと思う。 –

+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

関連する問題