gpt4 book ai didi

c# - 在 XNA 中,是否有从位图对象创建 Texture2D 的快速替代方法?

转载 作者:太空狗 更新时间:2023-10-29 17:33:01 24 4
gpt4 key购买 nike

我环顾四周,发现从位图创建 Texture2D 的唯一方法是:

using  (MemoryStream s = new  MemoryStream())
{
bmp.Save(s, System.Drawing.Imaging.ImageFormat.Png);
s.Seek(0, SeekOrigin.Begin);
Texture2D tx = Texture2D.FromFile(device, s);
}

Texture2D tx = new Texture2D(device, bmp.Width, bmp.Height,
0, TextureUsage.None, SurfaceFormat.Color);
tx.SetData<byte>(rgbValues, 0, rgbValues.Length, SetDataOptions.NoOverwrite);

其中 rgbValues 是一个字节数组,包含 32 位 ARGB 格式的位图像素数据。

我的问题是,有没有我可以尝试的更快的方法?

我正在编写一个 map 编辑器,它必须读取自定义格式的图像( map 图 block )并将它们转换为 Texture2D 纹理以进行显示。以前版本的编辑器是 C++ 实现,它首先将图像转换为位图,然后再转换为要使用 DirectX 绘制的纹理。我在这里尝试了相同的方法,但是上述两种方法都太慢了。要将 map 所需的所有纹理加载到内存中,第一种方法需要约 250 秒,第二种方法需要约 110 秒,在合理规范的计算机上(相比之下,C++ 代码大约需要 5 秒)。如果有直接编辑纹理数据的方法(例如使用 Bitmap 类的 LockBits 方法),那么我将能够将自定义格式的图像直接转换为 Texture2D,并有望节省处理时间。

非常感谢任何帮助。

谢谢

最佳答案

你想要 LockBits 吗?您将获得 LockBit。

在我的实现中,我从调用方传入了 GraphicsDevice,因此我可以使该方法成为通用的和静态的。

public static Texture2D GetTexture2DFromBitmap(GraphicsDevice device, Bitmap bitmap)
{
Texture2D tex = new Texture2D(device, bitmap.Width, bitmap.Height, 1, TextureUsage.None, SurfaceFormat.Color);

BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);

int bufferSize = data.Height * data.Stride;

//create data buffer
byte[] bytes = new byte[bufferSize];

// copy bitmap data into buffer
Marshal.Copy(data.Scan0, bytes, 0, bytes.Length);

// copy our buffer to the texture
tex.SetData(bytes);

// unlock the bitmap data
bitmap.UnlockBits(data);

return tex;
}

关于c# - 在 XNA 中,是否有从位图对象创建 Texture2D 的快速替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2869801/

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