Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取数据流sharpDX错误所有值均为0_C#_Sharpdx - Fatal编程技术网

C# 读取数据流sharpDX错误所有值均为0

C# 读取数据流sharpDX错误所有值均为0,c#,sharpdx,C#,Sharpdx,我在我的项目中采用了以下解决方案: 我没有足够的声誉来评论,所以我在这里开始一个新问题 我的项目基本上是直接2D,我有一个表面缓冲区,一个交换链。我想将缓冲区放入数据流并读取其值以将其放入位图并保存在磁盘上(如屏幕截图),但我的代码无法工作,因为所有字节值都是0(黑色),这没有意义,因为我的图像是全白色的,带有一点蓝色 这是我的密码: SwapChainDescription description = new SwapChainDescription() { Mode

我在我的项目中采用了以下解决方案:

我没有足够的声誉来评论,所以我在这里开始一个新问题

我的项目基本上是直接2D,我有一个表面缓冲区,一个交换链。我想将缓冲区放入数据流并读取其值以将其放入位图并保存在磁盘上(如屏幕截图),但我的代码无法工作,因为所有字节值都是0(黑色),这没有意义,因为我的图像是全白色的,带有一点蓝色

这是我的密码:

SwapChainDescription description = new SwapChainDescription()
     {
        ModeDescription = new ModeDescription(this.Width, this.Height, new Rational(60, 1), Format.B8G8R8A8_UNorm),
        SampleDescription = new SampleDescription(1, 0),
        Usage = Usage.RenderTargetOutput,
        BufferCount = 1,
        SwapEffect = SwapEffect.Discard,
        IsWindowed = true,
        OutputHandle = this.Handle
     };

     Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug | DeviceCreationFlags.BgraSupport, description, out device, out swapChain);

     SharpDX.DXGI.Device dxgiDevice = device.QueryInterface<SharpDX.DXGI.Device>();
     SharpDX.DXGI.Adapter dxgiAdapter = dxgiDevice.Adapter;

     SharpDX.Direct2D1.Device d2dDevice = new SharpDX.Direct2D1.Device(dxgiDevice);
     d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None);
     SharpDX.Direct3D11.DeviceContext d3DeviceContext = new SharpDX.Direct3D11.DeviceContext(device);




     properties = new BitmapProperties(new SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied),
          96, 96);

     Surface backBuffer = swapChain.GetBackBuffer<Surface>(0);
     d2dTarget = new SharpDX.Direct2D1.Bitmap(d2dContext, backBuffer, properties);

     d2dContext.Target = d2dTarget;

     playerBitmap = this.LoadBitmapFromContentFile(@"C:\Users\ndesjardins\Desktop\wave.png");

     //System.Drawing.Bitmap bitmapCanva = new System.Drawing.Bitmap(1254, 735);

     d2dContext.BeginDraw();
     d2dContext.Clear(SharpDX.Color.White);
     d2dContext.DrawBitmap(playerBitmap, new SharpDX.RectangleF(0, 0, playerBitmap.Size.Width, playerBitmap.Size.Height), 1f, SharpDX.Direct2D1.BitmapInterpolationMode.NearestNeighbor);
     SharpDX.Direct2D1.SolidColorBrush brush = new SharpDX.Direct2D1.SolidColorBrush(d2dContext, SharpDX.Color.Green);
     d2dContext.DrawRectangle(new SharpDX.RectangleF(200, 200, 100, 100), brush);
     d2dContext.EndDraw();

     swapChain.Present(1, PresentFlags.None);


     Texture2D backBuffer3D = backBuffer.QueryInterface<SharpDX.Direct3D11.Texture2D>();

     Texture2DDescription desc = backBuffer3D.Description;
     desc.CpuAccessFlags = CpuAccessFlags.Read;
     desc.Usage = ResourceUsage.Staging;
     desc.OptionFlags = ResourceOptionFlags.None;
     desc.BindFlags = BindFlags.None;

     var texture = new Texture2D(device, desc);

     d3DeviceContext.CopyResource(backBuffer3D, texture);

     byte[] data = null;
     using (Surface surface = texture.QueryInterface<Surface>())
     {
        DataStream dataStream;
        var map = surface.Map(SharpDX.DXGI.MapFlags.Read, out dataStream);
        int lines = (int)(dataStream.Length / map.Pitch);
        data = new byte[surface.Description.Width * surface.Description.Height * 4];

        dataStream.Position = 0;
        int dataCounter = 0;
        // width of the surface - 4 bytes per pixel.
        int actualWidth = surface.Description.Width * 4;
        for (int y = 0; y < lines; y++)
        {
           for (int x = 0; x < map.Pitch; x++)
           {
              if (x < actualWidth)
              {
                 data[dataCounter++] = dataStream.Read<byte>();
              }
              else
              {
                 dataStream.Read<byte>();
              }
           }
        }
        dataStream.Dispose();
        surface.Unmap();

        int width = surface.Description.Width;
        int height = surface.Description.Height;
        byte[] bytewidth = BitConverter.GetBytes(width);
        byte[] byteheight = BitConverter.GetBytes(height);

        Array.Copy(bytewidth, 0, data, 0, 4);
        Array.Copy(byteheight, 0, data, 4, 4);

     }
SwapChainDescription description=新的SwapChainDescription()
{
ModeDescription=新ModeDescription(this.Width,this.Height,new Rational(60,1),Format.B8G8R8A8_UNorm),
SampleDescription=新的SampleDescription(1,0),
用法=用法.RenderTargetOutput,
BufferCount=1,
SwapEffect=SwapEffect.丢弃,
IsWindowed=true,
outputhHandle=this.Handle
};
Device.CreateWithSwapChain(DriverType.Hardware,DeviceCreationFlags.Debug | DeviceCreationFlags.BgraSupport,description,out Device,out swapChain);
SharpDX.DXGI.Device dxgiDevice=Device.QueryInterface();
SharpDX.DXGI.Adapter dxgiAdapter=dxgiDevice.Adapter;
SharpDX.Direct2D1.Device d2device=新的SharpDX.Direct2D1.Device(dxgiDevice);
d2dContext=新的SharpDX.Direct2D1.DeviceContext(d2dDevice,SharpDX.Direct2D1.DeviceContextOptions.None);
SharpDX.Direct3D11.DeviceContext d3DeviceContext=新的SharpDX.Direct3D11.DeviceContext(设备);
属性=新的位图属性(新的SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.B8G8R8A8_UNorm,SharpDX.Direct2D1.AlphaMode.Premultiplied),
96, 96);
曲面backBuffer=swapChain.GetBackBuffer(0);
d2dTarget=新的SharpDX.Direct2D1.Bitmap(d2dContext,backBuffer,properties);
d2dContext.Target=d2dTarget;
playerBitmap=this.LoadBitmapFromContentFile(@“C:\Users\ndesjardins\Desktop\wave.png”);
//System.Drawing.Bitmap bitmapCanva=新的System.Drawing.Bitmap(1254735);
d2dContext.BeginDraw();
d2dContext.Clear(SharpDX.Color.White);
d2dContext.DrawBitmap(playerBitmap,新的SharpDX.RectangleF(0,0,playerBitmap.Size.Width,playerBitmap.Size.Height),1f,SharpDX.Direct2D1.BitmapInterpolationMode.NearestNeighbor);
SharpDX.Direct2D1.SolidColorBrush笔刷=新的SharpDX.Direct2D1.SolidColorBrush(d2dContext,SharpDX.Color.Green);
d2dContext.DrawRectangle(新的SharpDX.RectangleF(200200200100100),画笔);
d2dContext.EndDraw();
swapChain.Present(1,PresentFlags.None);
Texture2D backBuffer3D=backBuffer.QueryInterface();
texture2ddedescription desc=backBuffer3D.Description;
desc.CpuAccessFlags=CpuAccessFlags.Read;
desc.Usage=ResourceUsage.Staging;
desc.OptionFlags=ResourceOptionFlags.None;
desc.BindFlags=BindFlags.None;
var纹理=新纹理2d(设备,描述);
d3DeviceContext.CopyResource(backBuffer3D,纹理);
字节[]数据=null;
使用(Surface=texture.QueryInterface())
{
数据流;
var map=surface.map(SharpDX.DXGI.mapfags.Read,out数据流);
int行=(int)(dataStream.Length/map.Pitch);
数据=新字节[surface.Description.Width*surface.Description.Height*4];
dataStream.Position=0;
int dataCounter=0;
//表面宽度-每像素4字节。
int实际宽度=surface.Description.Width*4;
对于(int y=0;y

你们知道为什么最后返回的字节数组充满了0吗,因为它大部分应该是255?我在backbuffer中所做的只是绘制一个位图图像和一个矩形表单。数组。复制是将宽度和高度标题添加到字节数组中,因此我可以从中创建位图。

我在一篇评论中回答了这个问题,但是格式太糟糕了,所以非常抱歉

这看起来很有希望,但正如你在回答我的问题时所说的,这是很久以前的事了,我只是凭空说出来的,如果它不起作用,要么是有更新知识的人必须回答,要么是我必须获取一些源代码并亲自尝试

SharpDX.Direct2D1.Bitmap dxbmp = new SharpDX.Direct2D1.Bitmap(renderTarget, 
new SharpDX.Size2(bmpWidth, bmpHeight), new 
BitmapProperties(renderTarget.PixelFormat));
dxbmp.CopyFromMemory(bmpBits, bmpWidth * 4);

这看起来有点像你需要的。我假设这里的bmpBits要么是字节数组,要么是内存流,它们都可以保存下来,或者至少给你一些东西看看你是否真的得到了像素数据。我在一篇评论中回答说,但是格式太糟糕了,所以我道歉

这看起来很有希望,但正如你在回答我的问题时所说的,这是很久以前的事了,我只是凭空说出来的,如果它不起作用,要么是有更新知识的人必须回答,要么是我必须获取一些源代码并亲自尝试

SharpDX.Direct2D1.Bitmap dxbmp = new SharpDX.Direct2D1.Bitmap(renderTarget, 
new SharpDX.Size2(bmpWidth, bmpHeight), new 
BitmapProperties(renderTarget.PixelFormat));
dxbmp.CopyFromMemory(bmpBits, bmpWidth * 4);

这看起来有点像你需要的。我假设这里的bmpBits是一个字节数组或内存流,然后可以保存它们中的任何一个,或者至少给你一些东西看看你是否真的得到了像素数据

谢谢,copyFromMemory就是这样做的!我还想知道是否可以在不到5毫秒的时间内将位图从System.Drawing.bitmap转换为sharpDX.Direct2D1.bitmap?我不确定。我先前回复中的链接与加载SharpD有关