これら2つの違いを知りたいです。
_Bitmap bitmap1 = new Bitmap("C:\\test.bmp");
Bitmap bitmap2 = (Bitmap) Bitmap.FromFile("C:\\test.bmp");
_
1つのオプションは他のオプションよりも優れていますか? Bitmap.FromFile(path)
はビットマップ画像に追加データを入力しますか、それともnew Bitmap(path)
へのデリゲートだけですか?
'FromFile'メソッドは、基本クラス 'Image'(抽象クラス)から 'Bitmap'クラスに使用でき、Imageオブジェクトを返します。ここで、「ビットマップ」は「イメージ」クラスを継承する子クラスであり、ビットマップコンストラクターを使用すると、ビットマップオブジェクトを直接初期化できます。
あなたがやろうとしているのは、FromFileメソッドを呼び出してImageオブジェクトを取得し、それをビットマップに型キャストすることです。これを行うビットマップコンストラクターがある場合にこれを行う理由Bitmap.FromFile(path)はビットマップ画像に追加データを入力しますか:いいえ
どちらのメソッドも、path
引数を介して画像へのハンドルを取得します。 Image.FromFile
はスーパークラスImage
を返しますが、前者は単にBitmap
を返すため、キャストを回避できます。
内部的には、ほとんど同じです。
public static Image FromFile(String filename,
bool useEmbeddedColorManagement)
{
if (!File.Exists(filename))
{
IntSecurity.DemandReadFileIO(filename);
throw new FileNotFoundException(filename);
}
filename = Path.GetFullPath(filename);
IntPtr image = IntPtr.Zero;
int status;
if (useEmbeddedColorManagement)
{
status = SafeNativeMethods.Gdip.GdipLoadImageFromFileICM(filename, out image);
}
else
{
status = SafeNativeMethods.Gdip.GdipLoadImageFromFile(filename, out image);
}
if (status != SafeNativeMethods.Gdip.Ok)
throw SafeNativeMethods.Gdip.StatusException(status);
status = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, image));
if (status != SafeNativeMethods.Gdip.Ok)
{
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, image));
throw SafeNativeMethods.Gdip.StatusException(status);
}
Image img = CreateImageObject(image);
EnsureSave(img, filename, null);
return img;
}
そして:
public Bitmap(String filename)
{
IntSecurity.DemandReadFileIO(filename);
filename = Path.GetFullPath(filename);
IntPtr bitmap = IntPtr.Zero;
int status = SafeNativeMethods.Gdip.GdipCreateBitmapFromFile(filename, out bitmap);
if (status != SafeNativeMethods.Gdip.Ok)
throw SafeNativeMethods.Gdip.StatusException(status);
status = SafeNativeMethods.Gdip.GdipImageForceValidation(new HandleRef(null, bitmap));
if (status != SafeNativeMethods.Gdip.Ok)
{
SafeNativeMethods.Gdip.GdipDisposeImage(new HandleRef(null, bitmap));
throw SafeNativeMethods.Gdip.StatusException(status);
}
SetNativeImage(bitmap);
EnsureSave(this, filename, null);
}
言うのは難しい-Image.FromFile()
がファイルが存在するかどうかを確認し、そうでない場合はFileNotFoundException
をスローすることを除いて、両方のメソッドは内部的に非常に近いです。
主な違いは、Bitmap.ctor()
が内部でGdipCreateBitmapFromFile
を呼び出すのに対し、Image.FromFile()
はGdipLoadImageFromFile
を呼び出すことです。
これらのGdipメソッドは2つのMSDN記事( Bitmap.ctor() & Image.FromFile() )につながりますが、サポートされているファイル形式のようです異なる:
_Bitmap: BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
Image: BMP, GIF, JPEG, PNG, TIFF, and EMF.
_
とにかく、ビットマップを使用することがわかっている場合は、後で画像をキャストする必要をなくすためにnew Bitmap("C:\\test.bmp")
を使用します。