アプリケーションを展開する前に、アプリケーションのスモーク テストに XP VM と Vista VM を使用しています。これらの VM はどちらも 32 ビット カラーを使用しています。違いがあるかどうかはわかりませんが、VirtualBoxを使用しています。各マシンには、2 GB の RAM、2 つのプロセッサも割り当てられます。XP には 128MB のビデオ RAM、Vista 256 (いずれの場合も、私が設定できる最大値) があります。マシンを実行するデスクトップには、6 コアと 16 GB の RAM があります。繰り返しますが、この情報が関連しているかどうかはわかりませんが、誰が知っていますか.
Bitmap以下は、aを直接操作できる一連のピクセルに変換するために使用する拡張メソッドです。結局のところ、スピードが必要だからです。私たちが必要としているのはスピードです。脂っこい、スピードが速い!そして、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 と Windows 7 を使用していたときと同様に、Windows 8.1 の「実際の」マシンで完全に機能します。
しかし、VM では、「パラメーターが無効です」というメッセージが表示されて失敗します。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 つのシステムすべてで同じテスト イメージ セットを使用しています。
私の次の仮定は、VM のビデオ ハードウェアの制限ですが、結局のところ、3D シーンではなくビットマップであるということです...それで作業できるはずだと確信しています。
誰でもこの問題に光を当てることができますか? 「自分のマシンで動作する」ということだけに頼るのではなく、このコードの一部を適切にテストできるようにしたいのですが、とにかく VM に VS をインストールする必要はありません (確信があるわけではありません)。 XPにインストールします(Vistaよりも作業が目に見えて速いため、Vistaよりも好みます))。
他の誰かがこの問題に遭遇し、解決策を持っていることを願っています.Google検索は私を失望させました.