gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:34:11 28 4
gpt4 key购买 nike

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

为此,我想创建可以在屏幕上渲染墙壁、走廊、迷宫外部等的位图。

但是,我似乎不知道如何将现有图像文件加载到 SharpDX 中的 Bitmap 类中。库,或者如何从头开始创建一个新的此类 Bitmap 类。

由于据说所有类都直接映射到 DirectX 类型,我想这只是意味着我需要了解更多 DirectX,但我希望有一个简单的示例可以向我展示我需要做什么。

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

有人有过SharpDX的经验吗?图书馆,可以给我一些指示吗?

最佳答案

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

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

如果是,则没有API可以直接从文件加载SharpDX.Direct2D1.Bitmap(我会将此方法添加到API中)。我刚刚上传了一个bitmap sample正在执行此操作。

/// <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);
}
}
}

正如您所说,SharpDX 提供对原始低级 DirectX API 的访问(与提供更高级别 API 的 XNA 不同),因此您肯定需要了解如何对原始 DirectX 进行编程才能使用 SharpDX。

关于.net - 在 .NET 程序中将图像加载/创建到 SharpDX 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160510/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com