2017-12-28 40 views
0

私はWPFで少しゲームを作っています。私は別のゲームのインストールフォルダから抽出したスプライトシートを使用して、キャラクターの動きを連続させたいと思います。スプライトシートの特定の部分を切り取り、WPF C#でスプライトシートの背景なしで表示するにはどうすればよいですか?

「分離」黒の背景なしでスプライトシートイメージの必要な部分を切り取る方法を知りません。

はここspritesheetだ showing my character's various movements

私だけのクラスから継承される視覚化するためのクラスを使用することができます

System.Windows.Media.Drawing OR System.Windows.Media.Visual

(それはUNIでの割り当てのためだと彼らは私たちがこれらのいずれかから選択します)

+0

WPFでは、透明マスクを生成できます。このマスクは、目に見えないものにする必要があります。 – Gusdor

+0

最も簡単なことは、ソース画像で黒い背景を透明にすることです。 –

+0

スプライトシートの「特定の部分」に問題がある場合は、['ImageBrush'](https://msdn.microsoft.com/en-us/library/system.windows.media)を使うことができます。 .imagebrush(v = vs.110).aspx)と['Viewbox'](https://msdn.microsoft.com/en-us/library/system.windows.media.tilebrush.viewbox(v = vs.110) ).aspx)プロパティを表示するフレームの境界に設定します。その 'ImageBrush'を' Rectangle'のようなものの 'Fill'として使うことができます。 –

答えて

0

コードでこの問題を解決する必要がない場合は、迅速な解決策は、画像編集アプリケーションを使用することである。

  1. 背景にアルファチャンネルがあることを確認してください。
  2. マジックワンドツールを使用して、孤立した背景部分をそれぞれ選択します。
  3. 削除の選択。

背景を透明に変換するには私はあなたのイメージに、魔法のワンドの許容値をpaint.netを使用して数秒で0に設定しました。

opacity maskを使用してください。

割り当ての基準を満たしていませんが、もう1つの解決策は、実行時にすべての背景ピクセルを置き換えることです。これを行う場合は、結果をディスクに保存して、コストが一度だけ発生するようにします。これは本質的に私が記述した最初の解決策のDIYです。すなわち

// someBitmap is the bitmap you want to manipulate. 

// Ensure we're reading from a bitmap in Bgra32 format. 
var srcBitmap = someBitmap.Format == PixelFormats.Bgra32 ? 
    (BitmapSource)someBitmap : new FormatConvertedBitmap(someBitmap, PixelFormats.Bgra32, null, 0); 

// Copy the pixels of the source image to a buffer we can use. 
var width = srcBitmap.PixelWidth; 
var height = srcBitmap.PixelHeight; 
var stride = width * 4; 
var byteCount = height * stride; 
var srcData= new byte[byteCount]; 
srcBitmap.CopyPixels(srcData, stride, 0); 

var destBitmap = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgra32, null); 
var destData = new byte[byteCount]; 

// The channel offsets for PixelFormats.Bgra32. 
const int BlueOffset = 0; 
const int GreenOffset = 1; 
const int RedOffset = 2; 
const int AlphaOffset = 3; 

// Copy the image, filtering out the background. 
for (var y = 0; y < height; y++) { // Each column. 
    for (var x = 0; x < width; x++) { // Each row. 
     var i = (y * width + x) * 4; // The offset of this pixel in both srcBytes and destBytes. 
     var b = srcData[i + BlueOffset]; 
     var g = srcData[i + GreenOffset]; 
     var r = srcData[i + RedOffset]; 
     var a = srcData[i + AlphaOffset]; 

     // The "filter". 
     if (b == 0 && g == 0 && r == 0 && a == 255) { 
      // The pixel is solid black(the background color), set to transparent. 
      a = 0; 
     } 

     destData[i + BlueOffset] = b; 
     destData[i + GreenOffset] = g; 
     destData[i + RedOffset] = r; 
     destData[i + AlphaOffset] = a; 
    } 
} 
// Update the final image with the filtered buffer. 
destBitmap.WritePixels(new Int32Rect(0, 0, width, height), destData, stride, 0); 

// Finally, convert destBitmap to a BitmapImage and use that in place of someBitmap. 

BitmapImagedestBitmapを変換するためのthis答えを参照してください。

+0

私はあなたの最初の提案を(paint.netを使用して)試みました、そして、私は画像の黒い部分を削除することができました。問題は、変更された画像を保存するたびに、完全に透明な背景の代わりに白い背景で保存することです。 WPFで表示しようとすると、私の文字が白い矩形で表示されます。ですから元の問題はまだ解決されていません(ただ、私は今、黒の代わりに白い背景を持っています)。これに関するアドバイスはありますか? また、Opacity Maskを使ってみましたが、まだどのように動作しているのか分かりません。 (私はそれを理解しようとしていますが) –

+0

bmpかjpgとして保存しましたか? paint.netはbmpやjpgで透明度を保存しません。代わりにpngで保存してください。 –

+0

それは問題でした。 .pngとして保存すると機能します。ありがとうございました。 –

関連する問題