コードでこの問題を解決する必要がない場合は、迅速な解決策は、画像編集アプリケーションを使用することである。
- 背景にアルファチャンネルがあることを確認してください。
- マジックワンドツールを使用して、孤立した背景部分をそれぞれ選択します。
- 削除の選択。
背景を透明に変換するには私はあなたのイメージに、魔法のワンドの許容値を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.
BitmapImage
へdestBitmap
を変換するためのthis答えを参照してください。
WPFでは、透明マスクを生成できます。このマスクは、目に見えないものにする必要があります。 – Gusdor
最も簡単なことは、ソース画像で黒い背景を透明にすることです。 –
スプライトシートの「特定の部分」に問題がある場合は、['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'として使うことができます。 –