色合いは正しくなりました。
しかし、上下が反転しています。
左右は問題ないんですが。
private void CopyScreen2()
{
// 描画先メモリの確保
if(replicatedBitmapMemory == null)
{
replicatedBitmapMemory = new MemoryStream*1
{
using (var bmpGraphics = System.Drawing.Graphics.FromImage(screenBmp))
{
bmpGraphics.CopyFromScreen(0, 0, 0, 0, screenBmp.Size);
screenBmp.Save(replicatedBitmapMemory, System.Drawing.Imaging.ImageFormat.Bmp);
}
// メモリ参照イメージデータを生成
if (replicatedBitmap == null)
{
replicatedBitmap = new WriteableBitmap(screenBmp.Width, screenBmp.Height, 96, 96, PixelFormats.Bgr24, null);
}
var stride = ((int)SystemParameters.PrimaryScreenWidth * replicatedBitmap.Format.BitsPerPixel) / 8;
replicatedBitmap.WritePixels(new Int32Rect(0, 0, replicatedBitmap.PixelWidth, replicatedBitmap.PixelHeight),
replicatedBitmapMemory.GetBuffer(), stride, 0);
}
}
まず、色合いについては、デスクトップ画像のコピー先であるSystem.Drawing.Bitmapのフォーマットを「PixelFormat.Format24bppRgb」
ImageコントロールのソースになるWriteableBitmapのフォーマットを「PixelFormats.Bgr24」にしました。
もともと、Bitmapは、A(透明度)B(赤成分)G(緑成分)R(青成分)の並びで各ピクセル値のバイト配列が並んでいて、WriteableBitmapは、BGRAの並びで並んでいたため、色の整合性が取れず破たんしていました。
これを、両者ともにBGRの並びにすることで、整合性をとり、色をそろえることができるようになりました。
アルファチャンネルは使わないので排除、というか、これくらいしか両者で一致するパラメータがないみたいなので。。。
Bitmap側のパラメータ名は、~Rgbとなっていますが、実際はBGRのようです。
で、上下反転している問題は、どちらかは座標原点が左下、どっちかは左上になっているために起こっている問題です。
デスクトップ画面を下から上に向かって1行ずつピクセル列を拾っていくか、上から下に向かって1行ずつ拾っていくかの違いです。
Imageコントロールで上下反転してしまえば、それですむ話ですが、う~ん、それじゃあ納得が・・・というか、今後、画面キャプチャや画像出力を実装するにあたり、非常に都合が悪いです。
というわけで、反転問題だけ解決したら、0.30aとしてリリースします。
まだまだテスト版ですが。
・・・前回、0.29aでなくて、0.28aあたりにしとけば、ここでワンクッションはさめたのになーなんて(´・ω・`)
*1:int)SystemParameters.PrimaryScreenWidth
* (int)SystemParameters.PrimaryScreenHeight
* 3); // 24bit = 3byte [PixelFormat.Format24bppRgb]
}
else
{
replicatedBitmapMemory.Position = 0;
}
// デスクトップ画像でメモリを更新
using (var screenBmp = new System.Drawing.Bitmap(
(int)SystemParameters.PrimaryScreenWidth,
(int)SystemParameters.PrimaryScreenHeight,
System.Drawing.Imaging.PixelFormat.Format24bppRgb