のメカニズムを使用するには、次の関数を書き直すことができますか?私はこれが進行する方法ではないことを確かめています。ピクセル単位でコピーしています。C#でアルファ透明度を保持するビットマップピクセルを他のビットマップにコピーする方法は?
私はAlphaBlendまたはBitBltについて読んでいますが、ネイティブコードには慣れていません。
public static Bitmap GetAlphaBitmap(Bitmap srcBitmap)
{
Bitmap result = new Bitmap(srcBitmap.Width, srcBitmap.Height, PixelFormat.Format32bppArgb);
Rectangle bmpBounds = new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height);
BitmapData srcData = srcBitmap.LockBits(bmpBounds, ImageLockMode.ReadOnly, srcBitmap.PixelFormat);
try
{
for (int y = 0; y <= srcData.Height - 1; y++)
{
for (int x = 0; x <= srcData.Width - 1; x++)
{
Color pixelColor = Color.FromArgb(
Marshal.ReadInt32(srcData.Scan0, (srcData.Stride * y) + (4 * x)));
result.SetPixel(x, y, pixelColor);
}
}
}
finally
{
srcBitmap.UnlockBits(srcData);
}
return result;
}
重要注:ソース画像は、間違ったピクセル形式(Format32bppRgb)を有しているので、私は、アルファチャンネルを調整する必要があります。これは私のために働く唯一のメカニズムです。
srcイメージのピクセルフォーマットが間違っている理由は、hereです。
は、私は運なしで、次のオプションを試してみました:- がSRCからGraphics.drawImageをを使用してのsrcイメージを新しいイメージを作成して描画します。アルファを保存しませんでした。
- Scan0フォームsrcを使用して新しい画像を作成する。うまく動作しますが、GCがsrcイメージを処理するときに問題があります(他の例ではpostで説明しています)。
このソリューションは実際には機能する唯一のソリューションですが、最適ではありません。私はWinAPIや他の最適なメカニズムを使ってそれを行う方法を知る必要があります。
ありがとうございました!
どのように最適化する必要がありますか?安全でないブロックとポインタを使用して実行可能なオプションを使用していますか?私は、二次元配列とポインタを比較すると速度が3倍向上したという逸話的な証拠があります。 –