1

BitBltを使用してグラフィックスの領域を取得し、ビットマップに保存しようとしています。しかし、ここでは、私の問題を理解しやすいことを行います。

        Bitmap sourceBitmap = new Bitmap(64, 64, PixelFormat.Format32bppRgb);
        Graphics sourceGraphics = Graphics.FromImage(sourceBitmap);

        Bitmap destBitmap = new Bitmap(64, 64, PixelFormat.Format32bppRgb);
        Graphics destGraphics = Graphics.FromImage(destBitmap);

        sourceGraphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 30, 30));
        sourceGraphics.FillRectangle(new SolidBrush(Color.Green), new Rectangle(30, 30, 30, 30));

        destGraphics.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(0, 0, 30, 30));
        destGraphics.FillRectangle(new SolidBrush(Color.Yellow), new Rectangle(30, 30, 30, 30));

        IntPtr destDC = destGraphics.GetHdc();
        IntPtr destHB = destBitmap.GetHbitmap();
        IntPtr old = SelectObject(destDC, destHB);

        IntPtr sourceDC = sourceGraphics.GetHdc();
        IntPtr sourceHB = sourceBitmap.GetHbitmap();
        old = SelectObject(sourceDC, sourceHB);

        int success = BitBlt(
            destDC, 0, 0, 64, 64, sourceDC, 0, 0, 0x00CC0020
        );

BitBlt の後に、ソース ビットマップからブリットされたはずの赤/緑の四角形ではなく、私の destBitmap に青/黄の四角形 (宛先の初期ビットマップ) が含まれるのはなぜですか?

インポートは次のように行われます:

    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
    private static extern int BitBlt(
      IntPtr hdcDest,     // handle to destination DC (device context)
      int nXDest,         // x-coord of destination upper-left corner
      int nYDest,         // y-coord of destination upper-left corner
      int nWidth,         // width of destination rectangle
      int nHeight,        // height of destination rectangle
      IntPtr hdcSrc,      // handle to source DC
      int nXSrc,          // x-coordinate of source upper-left corner
      int nYSrc,          // y-coordinate of source upper-left corner
      System.Int32 dwRop  // raster operation code
      );

    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
    public static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);

    [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
    public static extern void DeleteObject(IntPtr obj);

最後に、コードをクリーニングし、ビットマップ ストリーミングしてビットマップ コンテンツを表示します。

        DeleteObject(destHB);
        DeleteObject(sourceHB);
        destGraphics.ReleaseHdc();
        sourceGraphics.ReleaseHdc();

        string path = "c:/tmp/dest.png";
        destBitmap.Save(path);
4

1 に答える 1