0

最近我要做低级图形编程工作(实现光栅图形算法)。这就是为什么我开始寻找有助于在低抽象级别(甚至使用unsafe代码)上绘制图元(线、矩形、椭圆等)的工具(类)。

我考虑是否应该在WPFWindowsFormsWinAPI或其他环境中实现我的算法。现在我要尝试一下WPF。我找到了一些如何在位图上绘制像素的示例,但不幸的是,我在理解此代码时遇到了问题(来自 MSDN 的源代码):

    // The DrawPixel method updates the WriteableBitmap by using 
    // unsafe code to write a pixel into the back buffer. 
    static void DrawPixel(MouseEventArgs e)
    {
        int column = (int)e.GetPosition(i).X;
        int row = (int)e.GetPosition(i).Y;

        // Reserve the back buffer for updates.
        writeableBitmap.Lock();

        unsafe
        {
            // Get a pointer to the back buffer. 
            int pBackBuffer = (int)writeableBitmap.BackBuffer;

            // Find the address of the pixel to draw.
            pBackBuffer += row * writeableBitmap.BackBufferStride;
            pBackBuffer += column * 4;//??

            // Compute the pixel's color. 
            int color_data = 255 << 16; // R
            color_data |= 128 << 8;   // G
            color_data |= 255 << 0;   // B 

            // Assign the color data to the pixel.
            *((int*)pBackBuffer) = color_data;//??
        }

        // Specify the area of the bitmap that changed.
        writeableBitmap.AddDirtyRect(new Int32Rect(column, row, 1, 1));

        // Release the back buffer and make it available for display.
        writeableBitmap.Unlock();
    }
  1. 这条pBackBuffer += column * 4;线是干什么用的?为什么4
  2. 这是什么*((int*)pBackBuffer) = color_data;意思?我知道来自C/C++的指针,但在C#中有IntPtrint*这行int pBackBuffer = (int)writeableBitmap.BackBuffer;表明我们可以平等对待intIntPtr这对我来说也不清楚。
  3. 我应该使用哪种编程环境?WinAPIWPF还是其他?

如果有人能向我解释这个不安全的代码,我将不胜感激。

4

2 回答 2

3

1:这是什么 pBackBuffer += column * 4; 行吗?为什么是4?

假设像素为 ARGB,则每个像素为 4 个字节。因为column是 X 坐标,所以必须乘以 4。

2:它是什么((int )pBackBuffer) = color_data; 意思是?

(int*)pBackBuffer- 将值int pBackBuffer视为指向 int的指针

*((int*)pBackBuffer) = color_data- 存储color_data到那个指针

IntPtr 和 int 并不完全相同。IntPtr 在 32 位操作系统上运行时为 32 位,在 64 位操作系统上运行时为 64 位。int始终为 32 位。

于 2012-10-06T22:12:25.700 回答
0

根据前面的评论,如果您希望代码同时适用于 x64 和 x86,则使用 int 而不是 IntPtr 指向 BackBuffer 是错误的。该行应为...

IntPtr pBackBuffer = (IntPtr)writeableBitmap.BackBuffer;

因为 BackBuffer 是一个指针,它会根据你的 x64 还是 x86 改变大小。'int' 将始终是 32 位的,因此在 x64 编译时可能会导致溢出异常

于 2016-12-02T01:05:26.897 回答