web-dev-qa-db-ja.com

Bitmap.FromFile(path)と新しいBitmap(path)の違い

これら2つの違いを知りたいです。

_Bitmap bitmap1 = new Bitmap("C:\\test.bmp");
Bitmap bitmap2 = (Bitmap) Bitmap.FromFile("C:\\test.bmp");
_

1つのオプションは他のオプションよりも優れていますか? Bitmap.FromFile(path)はビットマップ画像に追加データを入力しますか、それともnew Bitmap(path)へのデリゲートだけですか?

10
Matias Cicero

'FromFile'メソッドは、基本クラス 'Image'(抽象クラ​​ス)から 'Bitmap'クラスに使用でき、Imageオブジェクトを返します。ここで、「ビットマップ」は「イメージ」クラスを継承する子クラスであり、ビットマップコンストラクターを使用すると、ビットマップオブジェクトを直接初期化できます。

あなたがやろうとしているのは、FromFileメソッドを呼び出してImageオブジェクトを取得し、それをビットマップに型キャストすることです。これを行うビットマップコンストラクターがある場合にこれを行う理由Bitmap.FromFile(path)はビットマップ画像に追加データを入力しますか:いいえ

7
Binod Mahto

どちらのメソッドも、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);
}
3
Yuval Itzchakov

言うのは難しい-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")を使用します。

1
Waescher