1

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

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

Image.FromFile("test.png")

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

我知道如何执行上述所有操作,并且我知道它有效,但我只是想弄清楚当 Image 是抽象时它是如何工作的,因为我无法找到关于此事的太多信息 - 任何解释都是非常感激!

4

1 回答 1

2

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

该方法通过调用GdipGetImageTypeFromFile根据在文件中找到的内容确定返回的内容。

另外:类 Bitmap 不是为.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。

于 2013-05-15T05:49:19.520 回答