2013-02-02 7 views
5

私は大きなイメージにいくつかのPNGタイルイメージをマージする方法を探しています。だから私はいくつかのリンクを検索して見つけました。 Thisが正しく応答されません。 Thisはタイル張りではありません。画像をオーバーレイするのに適しており、thisはWPFを使用していません。だから私はこの質問をしています。WPNGでpngイメージを単一のイメージにマージする

問題定義:

私は4つのPNGイメージを持っています。私はこの

------------------- 
|  |  | 
| png1 | png2 | 
|  |  | 
------------------- 
|  |  | 
| png3 | png4 | 
|  |  | 
------------------- 

質問のように、単一のPNG画像にそれらをマージしたい:

この(結果の画像PNGである必要があります)を行うための最善かつ効率的な方法は何ですか?

+0

貯蓄とは別の問題です。結合されたビットマップを取得したら、サポートされている任意の形式で保存できます。 – ChrisF

答えて

13
// Loads the images to tile (no need to specify PngBitmapDecoder, the correct decoder is automatically selected) 
BitmapFrame frame1 = BitmapDecoder.Create(new Uri(path1), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First(); 
BitmapFrame frame2 = BitmapDecoder.Create(new Uri(path2), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First(); 
BitmapFrame frame3 = BitmapDecoder.Create(new Uri(path3), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First(); 
BitmapFrame frame4 = BitmapDecoder.Create(new Uri(path4), BitmapCreateOptions.None, BitmapCacheOption.OnLoad).Frames.First(); 

// Gets the size of the images (I assume each image has the same size) 
int imageWidth = frame1.PixelWidth; 
int imageHeight = frame1.PixelHeight; 

// Draws the images into a DrawingVisual component 
DrawingVisual drawingVisual = new DrawingVisual(); 
using (DrawingContext drawingContext = drawingVisual.RenderOpen()) 
{ 
    drawingContext.DrawImage(frame1, new Rect(0, 0, imageWidth, imageHeight)); 
    drawingContext.DrawImage(frame2, new Rect(imageWidth, 0, imageWidth, imageHeight)); 
    drawingContext.DrawImage(frame3, new Rect(0, imageHeight, imageWidth, imageHeight)); 
    drawingContext.DrawImage(frame4, new Rect(imageWidth, imageHeight, imageWidth, imageHeight)); 
} 

// Converts the Visual (DrawingVisual) into a BitmapSource 
RenderTargetBitmap bmp = new RenderTargetBitmap(imageWidth * 2, imageHeight * 2, 96, 96, PixelFormats.Pbgra32); 
bmp.Render(drawingVisual); 

// Creates a PngBitmapEncoder and adds the BitmapSource to the frames of the encoder 
PngBitmapEncoder encoder = new PngBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(bmp)); 

// Saves the image into a file using the encoder 
using (Stream stream = File.Create(pathTileImage)) 
    encoder.Save(stream); 
+0

#1で 'PngBitmapDecoder'を使わないのはなぜですか? –

+0

#4のコードサンプルを表示できますか? –

+0

@HosseinNarimaniRad私は別の方法を使うことに決めました。 WPFを使用する! –