请考虑以下代码示例,来自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。这个问题背后的原因是为了避免缓存未命中,嵌套循环应该根据二维数据结构的内存格式进行排列。
答案 0 :(得分:2)
可以找到Bitmap
的源代码here。在内部,位图详细信息存储在Image
对象(对内存中C ++对象的引用)中,这是GDI +的一部分。
你在MSDN上发现的是一个抽象层(如Adriano Repetti所说),它允许你不处理背后的代码。问题是,如果你想使用这些对象,你必须经历这些“抽象层”,这可能会降低性能。另一种方法是使用其他一些库或自己编程这个Bitmap / Image对象持有者。