使用 SharpDX 显示大图像
Displaying large image with SharpDX
我正在尝试使用 SharpDX 从文件中绘制大图像 (21000x7000)。
代码如下所示:
if (newBitmap==null)
{
ImagingFactory imagingFactory = new ImagingFactory();
NativeFileStream fileStream = new NativeFileStream(@"D:\path\myfile.png",
NativeFileMode.Open, NativeFileAccess.Read);
BitmapDecoder bitmapDecoder = new BitmapDecoder(imagingFactory, fileStream, DecodeOptions.CacheOnDemand);
BitmapFrameDecode frame = bitmapDecoder.GetFrame(0);
FormatConverter converter = new FormatConverter(imagingFactory);
// Format32bppPArgb
// Format32bppPRGBA
converter.Initialize(frame, SharpDX.WIC.PixelFormat.Format32bppPRGBA);
newBitmap = SharpDX.Direct2D1.Bitmap1.FromWicBitmap(target, converter);
}
target.DrawBitmap(newBitmap,new RawRectangleF(0,0,target.Size.Width,target.Size.Height),1,BitmapInterpolationMode.Linear );
执行时,我在 FromWicBitmap
函数中遇到以下异常:
Exception thrown: 'SharpDX.SharpDXException' in SharpDX.dll
Additional information: HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect.
当我将图像调整为 2100x700 时,它加载和显示都很好,所以问题出在图像尺寸上。
我想要这个尺寸的图片,因为以后我打算添加缩放功能。
我是 Direct2D 的新手。处理此问题的最佳方法是什么?
根据您的描述,听起来问题超出了 Direct3D 的纹理大小限制(Direct2D 使用 Direct3D 进行工作,因此它具有相同的限制)。
如果您查看 Direct3D Feature Level table 中的 最大纹理尺寸 ,您会看到范围从 4,096 到 16,384 像素 取决于图形硬件的级别。您可以:
- 假设 4,096 是您的限制(如果您运行在具有不同显卡的各种计算机上运行此程序,则您应该这样做)
- 运行 dxdiag.exe,单击 "Display 1" 选项卡,然后查找 Feature Levels 或 DDI 查看可用的功能级别。
解决方案是在调用 target.DrawBitmap
之前调整图像大小,直到它符合像素限制。换句话说,您无法像您希望的那样轻松地进行缩放 - 即使您放大和缩小纹理,在某些时候您也必须重新采样,否则它会比原始图像像素化更多。
我正在尝试使用 SharpDX 从文件中绘制大图像 (21000x7000)。
代码如下所示:
if (newBitmap==null)
{
ImagingFactory imagingFactory = new ImagingFactory();
NativeFileStream fileStream = new NativeFileStream(@"D:\path\myfile.png",
NativeFileMode.Open, NativeFileAccess.Read);
BitmapDecoder bitmapDecoder = new BitmapDecoder(imagingFactory, fileStream, DecodeOptions.CacheOnDemand);
BitmapFrameDecode frame = bitmapDecoder.GetFrame(0);
FormatConverter converter = new FormatConverter(imagingFactory);
// Format32bppPArgb
// Format32bppPRGBA
converter.Initialize(frame, SharpDX.WIC.PixelFormat.Format32bppPRGBA);
newBitmap = SharpDX.Direct2D1.Bitmap1.FromWicBitmap(target, converter);
}
target.DrawBitmap(newBitmap,new RawRectangleF(0,0,target.Size.Width,target.Size.Height),1,BitmapInterpolationMode.Linear );
执行时,我在 FromWicBitmap
函数中遇到以下异常:
Exception thrown: 'SharpDX.SharpDXException' in SharpDX.dll
Additional information: HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect.
当我将图像调整为 2100x700 时,它加载和显示都很好,所以问题出在图像尺寸上。
我想要这个尺寸的图片,因为以后我打算添加缩放功能。
我是 Direct2D 的新手。处理此问题的最佳方法是什么?
根据您的描述,听起来问题超出了 Direct3D 的纹理大小限制(Direct2D 使用 Direct3D 进行工作,因此它具有相同的限制)。
如果您查看 Direct3D Feature Level table 中的 最大纹理尺寸 ,您会看到范围从 4,096 到 16,384 像素 取决于图形硬件的级别。您可以:
- 假设 4,096 是您的限制(如果您运行在具有不同显卡的各种计算机上运行此程序,则您应该这样做)
- 运行 dxdiag.exe,单击 "Display 1" 选项卡,然后查找 Feature Levels 或 DDI 查看可用的功能级别。
解决方案是在调用 target.DrawBitmap
之前调整图像大小,直到它符合像素限制。换句话说,您无法像您希望的那样轻松地进行缩放 - 即使您放大和缩小纹理,在某些时候您也必须重新采样,否则它会比原始图像像素化更多。