Powrót, gdy używałem SlimDX, natknąłem się na ten sam problem (ładowanie mapy bitowej za pomocą Direct2D) i znalazłem podobne rozwiązanie, które eliminuje wbudowaną pętlę i wymaga nieco mniej kodu; przekonwertowanie go na SharpDX było proste. (Chciałbym móc powiedzieć, gdzie znalazłem oryginał, ale minęły lata i najwyraźniej nie udokumentowałem źródła, może to być prosto z próbek SlimDX ze wszystkiego, co wiem.)
Opuściłem przestrzenie nazw nienaruszone, dzięki czemu wiesz dokładnie, gdzie zdefiniowany jest każdy typ. Ponadto niektóre parametry (szczególnie te dla PixelFormat) są elastyczne; baw się z nimi i używaj wszystkiego, co działa dla ciebie.
private Bitmap Load(string filename)
{
System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(filename);
System.Drawing.Imaging.BitmapData bmpData =
bmp.LockBits(
new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
SharpDX.DataStream stream = new SharpDX.DataStream(bmpData.Scan0, bmpData.Stride * bmpData.Height, true, false);
SharpDX.Direct2D1.PixelFormat pFormat = new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied);
SharpDX.Direct2D1.BitmapProperties bmpProps = new SharpDX.Direct2D1.BitmapProperties(pFormat);
SharpDX.Direct2D1.Bitmap result =
new SharpDX.Direct2D1.Bitmap(
m_renderTarget,
new SharpDX.Size2(bmp.Width, bmp.Height),
stream,
bmpData.Stride,
bmpProps);
bmp.UnlockBits(bmpData);
stream.Dispose();
bmp.Dispose();
return result;
}
Jak widać, to blokuje strumień bitmapy ile podejścia Alexandre (która jest używana w powiązanym przykładowy projekt SharpDX), ale zamiast ręcznie kopiując każdy piksel, sam konstruktor kopiuje strumień za kulisami . Nie porównałem wydajności z metodą, którą zaproponował Alexandre, więc nie mogę powiedzieć, która metoda jest szybsza, ale ta jest wystarczająco szybka dla moich celów, a kod jest czysty.
(przepraszam za brak podświetlanie składni,. Kod < > tag z jakiegoś powodu łamie mi fragment na sekcje)