C#中的Bitmap类是否在内部逐列存储像素

时间:2018-05-04 08:58:20

标签: c# bitmap pixels

请考虑以下代码示例,来自msdn,

private void SetPixel_Example(PaintEventArgs e)
{
    // Create a Bitmap object from a file.
    Bitmap myBitmap = new Bitmap("Grapes.jpg");

    // Draw myBitmap to the screen.
    e.Graphics.DrawImage(myBitmap, 0, 0, myBitmap.Width, myBitmap.Height);

    // Set each pixel in myBitmap to black.
    for (int Xcount = 0; Xcount < myBitmap.Width; Xcount++)
    {
        for (int Ycount = 0; Ycount < myBitmap.Height; Ycount++)
        {
            myBitmap.SetPixel(Xcount, Ycount, Color.Black);
        }
    }

    // Draw myBitmap to the screen again.
    e.Graphics.DrawImage(myBitmap, myBitmap.Width, 0, myBitmap.Width, myBitmap.Height);
}

请注意,nest for循环中的外部循环在索引上迭代到位图的宽度,内部循环在索引上迭代到位图的高度。我在其他几个地方看到了相同风格的代码片段。

我的问题是:这是否意味着Bitmap对象在内部逐列存储其像素信息,即将所有像素视为屏幕中的矩阵,它按列存储在主存储器中,如编程一样语言Fortran。这个问题背后的原因是为了避免缓存未命中,嵌套循环应该根据二维数据结构的内存格式进行排列。

1 个答案:

答案 0 :(得分:2)

可以找到Bitmap的源代码here。在内部,位图详细信息存储在Image对象(对内存中C ++对象的引用)中,这是GDI +的一部分。

你在MSDN上发现的是一个抽象层(如Adriano Repetti所说),它允许你不处理背后的代码。问题是,如果你想使用这些对象,你必须经历这些“抽象层”,这可能会降低性能。另一种方法是使用其他一些库或自己编程这个Bitmap / Image对象持有者。