我想知道为什么可以设置PictureBox的Image属性,当Image类是一个抽象类时,因此无法实例化。
Image.FromFile()方法是否创建了一个Bitmap(Image中的派生类),然后用它在PictureBox中显示?如果是这样,那么当从不是.bmp的文件创建图像时,如果我使用:
Image.FromFile("test.png")
在显示之前是否将此.png文件转换为内存中的位图?
我知道如何做到以上所有,而且我知道它有效,但我只是想弄清楚当Image是抽象的时它是如何工作的,因为我无法找到关于此事的更多信息 - 任何非常感谢解释!
答案 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。