用于 SharpDX 的灰度 8BPP 位图。Direct2D1.Bitmap
Grayscale 8BPP bitmap for SharpDX.Direct2D1.Bitmap
我目前正在使用 SharpDX.Direct2D1
制作 2D 应用程序。
这是我的 2D deviceContext 设置,可以正常工作。
m_swapchaindesc = New SwapChainDescription()
With m_swapchaindesc
.BufferCount = 2
.ModeDescription =
New ModeDescription(control.Width, control.Height,
New Rational(60, 1), Format.R8G8B8A8_UNorm)
.IsWindowed = True
.OutputHandle = control.Handle
.SampleDescription = New SampleDescription(1, 0)
.SwapEffect = SwapEffect.Discard
.Usage = Usage.RenderTargetOutput
End With
SharpDX.Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport Or DeviceCreationFlags.Debug, m_swapchaindesc, m_device, m_swapChain)
Dim dxgiDevice As SharpDX.DXGI.Device = m_device.QueryInterface(Of SharpDX.DXGI.Device)()
m_2dDevice = New SharpDX.Direct2D1.Device(dxgiDevice)
m_d2dContext = New SharpDX.Direct2D1.DeviceContext(m_2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None)
m_properties = New BitmapProperties(New SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.R8G8B8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied), 96, 96)
m_backBuffer = m_swapChain.GetBackBuffer(Of Surface)(0)
m_2dTarget = New SharpDX.Direct2D1.Bitmap(m_d2dContext, m_backBuffer, m_properties)
m_d2dContext.Target = m_2dTarget
我的问题:我想在我的 deviceContext 上以灰度绘制 8bpp 位图,这意味着我不需要它是每像素 32 位,这会占用大量内存。为了内存目的,我希望它只有 8 位。当我这样做时出现问题,这意味着设置我的 BitmapProperties
,只有 Format.R8_Unorm
或 Format.A8_Unorm
看起来很有趣,因为我猜他们只有 8bpp。但是,当我输入此格式并尝试实例化我的 SharpDX.Direct2D1.Bitmap
时,它 returns 一条错误消息显示 WRONGPIXELFORMAT.
我意识到在创建位图时似乎只有 Format.R8G8B8A8_Unorm
有效,而我不需要。
你们中有人在 SharpDX 上使用过 8bpp 灰度位图吗?
不能将 8BPP 位图用于 SharpDX (DirectX)。这不是 DirectX 支持的格式。为了能够显示灰度图像,您必须将您的 rgb 的所有值设置为相同的值,或者将着色器应用于图像以将所有颜色转换为灰色。
我目前正在使用 SharpDX.Direct2D1
制作 2D 应用程序。
这是我的 2D deviceContext 设置,可以正常工作。
m_swapchaindesc = New SwapChainDescription()
With m_swapchaindesc
.BufferCount = 2
.ModeDescription =
New ModeDescription(control.Width, control.Height,
New Rational(60, 1), Format.R8G8B8A8_UNorm)
.IsWindowed = True
.OutputHandle = control.Handle
.SampleDescription = New SampleDescription(1, 0)
.SwapEffect = SwapEffect.Discard
.Usage = Usage.RenderTargetOutput
End With
SharpDX.Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.BgraSupport Or DeviceCreationFlags.Debug, m_swapchaindesc, m_device, m_swapChain)
Dim dxgiDevice As SharpDX.DXGI.Device = m_device.QueryInterface(Of SharpDX.DXGI.Device)()
m_2dDevice = New SharpDX.Direct2D1.Device(dxgiDevice)
m_d2dContext = New SharpDX.Direct2D1.DeviceContext(m_2dDevice, SharpDX.Direct2D1.DeviceContextOptions.None)
m_properties = New BitmapProperties(New SharpDX.Direct2D1.PixelFormat(SharpDX.DXGI.Format.R8G8B8A8_UNorm, SharpDX.Direct2D1.AlphaMode.Premultiplied), 96, 96)
m_backBuffer = m_swapChain.GetBackBuffer(Of Surface)(0)
m_2dTarget = New SharpDX.Direct2D1.Bitmap(m_d2dContext, m_backBuffer, m_properties)
m_d2dContext.Target = m_2dTarget
我的问题:我想在我的 deviceContext 上以灰度绘制 8bpp 位图,这意味着我不需要它是每像素 32 位,这会占用大量内存。为了内存目的,我希望它只有 8 位。当我这样做时出现问题,这意味着设置我的 BitmapProperties
,只有 Format.R8_Unorm
或 Format.A8_Unorm
看起来很有趣,因为我猜他们只有 8bpp。但是,当我输入此格式并尝试实例化我的 SharpDX.Direct2D1.Bitmap
时,它 returns 一条错误消息显示 WRONGPIXELFORMAT.
我意识到在创建位图时似乎只有 Format.R8G8B8A8_Unorm
有效,而我不需要。
你们中有人在 SharpDX 上使用过 8bpp 灰度位图吗?
不能将 8BPP 位图用于 SharpDX (DirectX)。这不是 DirectX 支持的格式。为了能够显示灰度图像,您必须将您的 rgb 的所有值设置为相同的值,或者将着色器应用于图像以将所有颜色转换为灰色。