System.Drawing.Image类是如何工作的?

时间:2013-05-15 04:49:08

标签: c# image graphics picturebox abstract

我想知道为什么可以设置PictureBox的Image属性,当Image类是一个抽象类时,因此无法实例化。

Image.FromFile()方法是否创建了一个Bitmap(Image中的派生类),然后用它在PictureBox中显示?如果是这样,那么当从不是.bmp的文件创建图像时,如果我使用:

Image.FromFile("test.png")

在显示之前是否将此.png文件转换为内存中的位图?

我知道如何做到以上所有,而且我知道它有效,但我只是想弄清楚当Image是抽象的时它是如何工作的,因为我无法找到关于此事的更多信息 - 任何非常感谢解释!

1 个答案:

答案 0 :(得分:2)

Image.FromFile("test.png")返回Image的事实并不意味着它返回Image类的实例。因为Image是抽象的,所以它只能返回Image的子类。

方法FromFile通过调用GdipGetImageType根据文件中的内容确定返回的内容。

另外:类{Bit}不是为.bmp文件保留的。通过使用解码器,FromFile方法将文件的字节转换为图像的内存表示。通常是一大块字节,用于指定像素的红色,蓝色,绿色和alpha值。它存储在Bitmap类的实例中。

另一种类型的文件是图元文件。这些文件不包含像素信息,但包含矢量信息。当读取图元文件时,它不会变成存储器中的像素数据,而是存储矢量信息。这使得图元文件可以在不损失质量的情况下调整图像大小。

FromFile调用的方法如下所示:

internal static Image CreateImageObject(IntPtr nativeImage)
{
  int type = -1;
  int imageType = SafeNativeMethods.Gdip.GdipGetImageType(new HandleRef((object) null, nativeImage), out type);
  if (imageType != 0)
    throw SafeNativeMethods.Gdip.StatusException(imageType);
  switch (type)
  {
    case 1:
      return (Image) Bitmap.FromGDIplus(nativeImage);
    case 2:
      return (Image) Metafile.FromGDIplus(nativeImage);
    default:
      throw new ArgumentException(System.Drawing.SR.GetString("InvalidImage"));
  }
}

根据图像类型创建并加载图元文件或位图对象。这两种类型来自Image。