System.Drawing.Image 和 System.Drawing.Bitmap 有什么区别?

19

我不太清楚System.Drawing.ImageSystem.Drawing.Bitmap之间有何不同。

能否有人解释一下这两种类型的主要区别?

为什么要使用 System.Drawing.Bitmap 而不是 System.Drawing.Image 呢?


3
请查看这个链接:https://dev59.com/TnNA5IYBdhLWcg3wdtz5也请检查一下。 - Abin
1
从面向对象的角度来看,位图是一种图像。 - BeemerGuy
5个回答

18

位图图像继承:

System.Drawing.Bitmap : System.Drawing.Image
{ }

Image 是一个抽象类,这意味着:

抽象修饰符表示被修饰的东西具有缺失或不完整的实现。

Bitmap 是一个密封类,这意味着:

当应用于一个类时,sealed 修饰符防止其他类继承它。

请参见以下内容:

Bitmap bmp = new Bitmap(filename); // Works
Image img = new Image(); // The compiler says: "Cannot access internal constructer 'Image' here.

这是因为 Image 不是用来这样使用的。它仅提供了 Bitmap 类的功能。

所以在处理像 jpeg、png、bmp 等像素化图像时,请使用 Bitmap

如果你的方法不需要特定类型的图像,而且 Image 的方法足够使用,请将更通用的 Image 作为参数类型。这个方法也会接受其他继承自 Image 的类,例如 Metafile


6
如果我可以补充一点,请不要害怕将类型为“Bitmap”的变量传递给以“Image”为参数的函数...因为“Bitmap”是一个“Image”,所以它会被接受。例如,g.DrawImage(mybitmap, 0, 0) 是可行的,其中 mybitmap 的类型为 Bitmap(这里,g 的类型为 Graphics,而 DrawImage 接受 Image 作为参数)。 - BeemerGuy
@CPerkins 你说得对。感谢指出这一点!我已经调整了我的帖子,随意改进它。 - Andy
直接使用例如 Image.FromFile() 有什么好处吗?我已经看到它被多次使用,只是在下一步中转换为位图。 - Adrian Hood Sr
从来源:https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Image.cs,e328c776c1ca78db,references 它似乎也可以返回一个“Metafile”对象。然后对“Bitmap”的转换将失败。但通常您事先知道期望的对象类型。 - Andy

4

我不确定你说的是什么区别?

System.Drawing.ImageSystem.Drawing.Bitmap 的基类。

System.Drawing.Image 同样也是抽象类,因此您无法创建它的实例。您只能创建 System.Drawing.Bitmap 的实例。

Image.FromFile、Image.BlahBlah... 只会返回 Bitmap 的实例。


3
正如MSDN文档明确说明的那样,System.Drawing.Image是一个提供BitmapMetafile派生类功能的抽象基类。因此,您不能将它们进行比较。System.Drawing.Bitmap类是System.Drawing.Image抽象类的具体实现。

1

Image是一个基础抽象类,代表着光栅图像。Bitmap是基于GDI+实现的该抽象类的一种实现。


0
Bitmap bmp = (Bitmap)Image.FromFile(path); // Works

虽然您无法创建“Image”类型的对象,但仍可使用其方法。请注意需要将其强制转换为“Bitmap”类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接