C# 位图图像指针SlimDX

C# 位图图像指针SlimDX,c#,pointers,slimdx,C#,Pointers,Slimdx,如何制作指向图像的指针,以便将其用作纹理 代码如下: device.BeginScene(); sprite.Begin(SlimDX.Direct3D9.SpriteFlags.None); var newImage = Image.FromStream(ms); tx = SlimDX.Direct3D9.Texture.FromPointer((IntPtr)newImage); form.Size = newImage.Size; sprite.Draw(tx, Color.Trans

如何制作指向图像的指针,以便将其用作纹理

代码如下:

device.BeginScene();
sprite.Begin(SlimDX.Direct3D9.SpriteFlags.None);
var newImage = Image.FromStream(ms);

tx = SlimDX.Direct3D9.Texture.FromPointer((IntPtr)newImage);
form.Size = newImage.Size;
sprite.Draw(tx, Color.Transparent);
sprite.End();
device.EndScene();
device.Present();
正如你可能猜到的,它不起作用。但是我想从图像中找出一个点,或者从图像中找出一个点。因为我以后需要重用image变量,所以
Texture.FromStream
不起作用,因为它只允许我使用它一次

编辑:

混乱图像:

        device.BeginScene();
        sprite.Begin(SlimDX.Direct3D9.SpriteFlags.None);
        tx = SlimDX.Direct3D9.Texture.FromStream(device, ms, SlimDX.Direct3D9.Usage.None, SlimDX.Direct3D9.Pool.Managed);
        sprite.Draw(tx, Color.Transparent);
        sprite.End();
        tx.Dispose();
        device.EndScene();
        device.Present();
但如果我将纹理更改为:

tx = SlimDX.Direct3D9.Texture.FromStream(device, ms, 0, 0, 0, SlimDX.Direct3D9.Usage.None, SlimDX.Direct3D9.Format.A8R8G8B8, SlimDX.Direct3D9.Pool.Managed, SlimDX.Direct3D9.Filter.None, SlimDX.Direct3D9.Filter.None, 0);
它可以工作(注意到现在我可以将大小设置为0,我猜这意味着默认值)

但我不明白的是格式,有数百种不同的格式。我不知道哪一个是GPU最快的还是本地的;

还有一件事,我怎样才能得到纹理的大小? 因为我想我的形式调整到纹理大小,如果它改变

编辑2:


好吧,看起来0,0大小只会使纹理延伸到窗口;S

您可以使用
ms.Seek(0,请参见korigin.Begin)重置流。假设
ms
是一个
MemoryStream
。这很好。虽然我认为FromStream会重置它,但不确定。但我不想一次又一次地重复使用memorystream。我面临的问题是。我想在纹理上得到正确的大小。由于某些原因,我必须手动设置它,否则它会出错(放大)。为什么不想重置流?这就是系统内存的用途(RAM=>随机存取内存)。
ms
中存在什么样的数据?您是否正确设置了视口?
sprite
对象上是否有任何转换?纹理应该以其原始大小进行渲染。仅仅使用一次不是更快吗?如果我必须在每个循环中多次读取memorystream,那么它必须花费更长的时间(即使RAM确实非常快)。早些时候我问了一个问题,你帮了我一点忙。好吧,我什么都不设定。或者,我设置了表单大小,这很好。但是如果我没有设置特定的设置,纹理会被弄乱,这将在我的代码中显示示例。你可以通过
GetLevelDescription(0)
获得纹理的大小。