可以重寫下面的函數來使用任何優化的機制?我很確定,這不是繼續進行的方式,逐個像素地進行復制。如何將位圖像素複製到其他位圖保留在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),所以我需要調整alpha通道。這是唯一適合我的機制。
爲什麼SRC形象有一個錯誤的像素格式說明here的原因。
我嘗試以下選項沒有運氣:
- 創建一個新的圖像,然後使用Graphics.DrawImage從SRC的SRC圖像。沒有保留阿爾法。
- 使用Scan0表格src創建新圖像。工作正常,但GC處理src圖像時出現問題(在其他post中解釋);
該解決方案是唯一真正有效的解決方案,但我知道這並不是最佳解決方案。我需要知道如何使用WinAPI或其他最佳機制來做到這一點。
非常感謝!
應該如何優化?是否使用不安全的塊和指針算術可行的選項?我有軼事證據顯示比較雙維數組和指針時速度提高了3倍。 – 2012-02-16 21:42:06