あさりのみそしるダイアリー

ブラック社員がお届けする一貫しないネタの数々・・・おあがりよ!

おしい

イメージ 1


色合いは正しくなりました。
しかし、上下が反転しています。
左右は問題ないんですが。



    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