在部署应用程序之前,我使用 XP VM 和 Vista VM 对我的应用程序进行冒烟测试。这两个 VM 都使用 32 位颜色。不确定它是否有任何区别,但我正在使用 VirtualBox。每台机器还分配了 2GB 的内存,2 个处理器。XP 有 128MB 的视频内存,Vista 256(在每种情况下我都可以设置它们的最大值)。运行这些机器的桌面有 6 核和 16GB 内存。同样,不确定此信息是否相关,但谁知道。
以下是我用来将 aBitmap
转换为可以直接使用的一堆像素的扩展方法。因为,毕竟我们需要速度。我们需要的是速度。油腻,速度快!而 Bitmap.GetPixel 则与之相反。
public static ArgbColor[] GetPixels(this Bitmap bitmap)
{
ArgbColor[] results;
int width;
int height;
BitmapData bitmapData;
width = bitmap.Width;
height = bitmap.Height;
results = new ArgbColor[width * height];
bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
ArgbColor* pixelPtr;
pixelPtr = (ArgbColor*)(void*)bitmapData.Scan0;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
results[row * width + col] = *pixelPtr;
pixelPtr++;
}
}
}
bitmap.UnlockBits(bitmapData);
return results;
}
这段代码在我的 Windows 8.1“真实”机器上完美运行,就像我之前使用 Windows 8 和 Windows 7 时一样。
但在虚拟机上,它失败并显示“参数无效”。ArgumentException
:
System.Drawing.Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)
System.Drawing.Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)
Cyotek.Drawing.ImageExtensions.GetPixels(Bitmap bitmap)
根据文档,这是因为PixelFormat 值不是特定的每像素位数值,或者为 bitmap 传入了不正确的 PixelFormat。
我没有在这些 VM 上安装 VS,但我确实在打开图像并打印了它的格式上放置了一个测试程序......这是预期的PixelFormat.Format32bppArgb
。我在所有 3 个系统上使用同一组测试图像。
我的下一个假设是虚拟机视频硬件的限制,但归根结底,它是位图而不是 3D 场景……我很确定我应该能够使用它。
任何人都可以对这个问题有所了解吗?我真的很希望能够正确测试其中的一些代码,而不是仅仅依靠“它可以在我的机器上运行”,而且我宁愿不必在 VM 上安装 VS(我什至不确定它'将安装在 XP 上(我更喜欢 Vista 上的那个,因为它使用起来明显更快))。
希望其他人遇到过这个问题并有解决方案 - 谷歌搜索让我失望了。