在.NET程序中将图像加载/创建到SharpDX中

ang*_*son 7 .net directx image bitmap

我正在尝试使用SharpDX使用DirectX创建一个简单的迷宫式2D程序.

为此,我想创建位图,我可以在屏幕上呈现墙壁,走廊,迷宫外等.

但是,我似乎无法弄清楚如何将现有的图像文件加载到SharpDX库中的Bitmap类中,或者如何从头开始创建一个新的这样的Bitmap类.

由于所有类都被称为直接映射到DirectX类型,我想这只是意味着我需要学习更多的DirectX,但我希望有一个简单的例子可以告诉我我需要做什么.

如果我必须从头开始构建一个新的Bitmap并绘制它,我可以做到这一点,获得我需要的像素并不困难,但我似乎无法弄清楚那部分.

有没有人对SharpDX库有任何经验,可以给我一些指示?

小智 10

您应该直接向Sharpdx项目的"问题"选项卡询问此问题,因为我可以从那里给您快速回复(您很幸运我有时会从网上查看其用法;)).如果您正式提出这个问题,我可以对库进行改进,并在问题数据库中记录您的请求.

关于您的特定问题,目前尚不清楚您使用的是哪种DirectX API.我假设您使用的是Direct2D?

如果是,则没有API直接从文件加载SharpDX.Direct2D1.Bitmap(我将此方法添加到API).我刚刚上传了一个执行此操作的位图示例.

/// <summary>
/// Loads a Direct2D Bitmap from a file using System.Drawing.Image.FromFile(...)
/// </summary>
/// <param name="renderTarget">The render target.</param>
/// <param name="file">The file.</param>
/// <returns>A D2D1 Bitmap</returns>
public static Bitmap LoadFromFile(RenderTarget renderTarget, string file)
{
    // Loads from file using System.Drawing.Image
    using (var bitmap = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(file))
    {
        var sourceArea = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height);
        var bitmapProperties = new BitmapProperties(new PixelFormat(Format.R8G8B8A8_UNorm, AlphaMode.Premultiplied));
        var size = new System.Drawing.Size(bitmap.Width, bitmap.Height);

        // Transform pixels from BGRA to RGBA
        int stride = bitmap.Width * sizeof(int);
        using (var tempStream = new DataStream(bitmap.Height * stride, true, true))
        {
            // Lock System.Drawing.Bitmap
            var bitmapData = bitmap.LockBits(sourceArea, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);

            // Convert all pixels 
            for (int y = 0; y < bitmap.Height; y++)
            {
                int offset = bitmapData.Stride*y;
                for (int x = 0; x < bitmap.Width; x++)
                {
                    // Not optimized 
                    byte B = Marshal.ReadByte(bitmapData.Scan0, offset++);
                    byte G = Marshal.ReadByte(bitmapData.Scan0, offset++);
                    byte R = Marshal.ReadByte(bitmapData.Scan0, offset++);
                    byte A = Marshal.ReadByte(bitmapData.Scan0, offset++);
                    int rgba = R | (G << 8) | (B << 16) | (A << 24);
                    tempStream.Write(rgba);
                }

            }
            bitmap.UnlockBits(bitmapData);
            tempStream.Position = 0;

            return new Bitmap(renderTarget, size, tempStream, stride, bitmapProperties);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如你所说,SharpDX可以访问原始低级别的DirectX API(不像XNA那样提供更高级别的API),所以你肯定需要了解程序原始DirectX如何使用SharpDX.