Вернувшись, когда я использовал SlimDX, я столкнулся с той же проблемой (загрузка растрового изображения с помощью Direct2D) и нашел аналогичное решение, которое устраняет встроенный цикл и требует немного меньше кода;преобразование его в SharpDX было простым делом.(Хотелось бы сказать вам, где я нашел оригинал, но это были годы, и, видимо, я не документировал источник. Это может быть прямо из образцов SlimDX, насколько я знаю.)
Я ушелпространства имен не повреждены, поэтому вы точно знаете, где определен каждый тип.Кроме того, некоторые параметры (в частности, для PixelFormat) являются гибкими;поэкспериментируйте с ними и используйте все, что вам подходит.
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;
}
Как вы можете видеть, он блокирует поток растровых изображений почти так же, как подход Александра (который используется в связанном примере проекта SharpDX), но вместо того, чтобы вручнуюкопируя каждый пиксель, конструктор сам копирует поток за кулисы.Я не сравнивал производительность с методом, предложенным Александром, поэтому я не могу сказать вам, какой метод быстрее, но этот достаточно быстрый для моих целей, и код чистый.
(Извинитеиз-за отсутствия подсветки синтаксиса тег по некоторым причинам разбивает мой фрагмент на разделы.)