web-dev-qa-db-ja.com

C#でプロジェクトのリソース領域から画像を読み込む

プロジェクト内の画像がResources/myimage.jpgに保存されています。どうやってこの画像を動的にBitmapオブジェクトに読み込むことができますか?

198
Pavel Bastov

Windowsフォームを使用していますか? Properties/Resources UIを使用して画像を追加した場合は、生成コードから画像にアクセスできるので、これを実行するだけで済みます。

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
227
Matt Hamilton

以下の方法で画像への参照を取得できます。

Image myImage = Resources.myImage;

画像のコピーを作成する場合は、次の手順を実行する必要があります。

Bitmap bmp = new Bitmap(Resources.myImage);

使い終わったら、bmpを破棄することを忘れないでください。コンパイル時にリソースイメージの名前がわからない場合は、リソースマネージャを使用できます。

ResourceManager rm = Resources.ResourceManager;
Bitmap myImage = (Bitmap)rm.GetObject("myImage");

ResourceManagerの利点は、Resources.myImageが通常は対象外となる場所、または動的にリソースにアクセスする場所で使用できることです。さらに、これはサウンド、設定ファイルなどにも働きます。

108
Charlie Salts

あなたはリソースストリームからそれをロードする必要があります。

Bitmap bmp = new Bitmap(
  System.Reflection.Assembly.GetEntryAssembly().
    GetManifestResourceStream("MyProject.Resources.myimage.png"));

アセンブリ内のすべてのリソース名を知りたい場合は、以下の手順に従ってください。

string[] all = System.Reflection.Assembly.GetEntryAssembly().
  GetManifestResourceNames();

foreach (string one in all) {
    MessageBox.Show(one);
}
68
Josip Medved

提案された答えのほとんどすべてよりも簡単な方法

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
25
JDS

最善のことは、プロジェクトのリソース設定でそれらを画像リソースとして追加することです。そうすると、Resources.myimageを実行して直接画像を取得できます。これは生成されたC#プロパティを介して画像を取得します。

画像を埋め込みリソースとして設定しただけの場合は、次の方法で取得できます。

string name = "Resources.myimage.jpg"
string namespaceName = "MyCompany.MyNamespace";
string resource = namespaceName + "." + name;
Type type = typeof(MyCompany.MyNamespace.MyTypeFromSameAssemblyAsResource);
Bitmap image = new Bitmap(type.Assembly.GetManifestResourceStream(resource));

MyTypeFromSameAssemblyAsResourceは、アセンブリ内にある任意の型です。

13
Hallgrim

私のプロジェクトのいくつかで使用しているコード...これは、アイコンではなくビットマップとしてのみリソースに画像を格納することを前提としています

    public static Bitmap GetImageByName(string imageName)
    {
        System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
        string resourceName = asm.GetName().Name + ".Properties.Resources";
        var rm = new System.Resources.ResourceManager(resourceName, asm);
        return (Bitmap)rm.GetObject(imageName);

    }
12
Gary Kindel

WithおよびImageBox "ImagePreview FormStrings.MyImageNames"には、通常のget/set文字列キャストメソッドが含まれています。これは、スクロールボックスタイプのリストにリンクされています。ビットマップはresources.resxにドラッグされます

Object rm = Properties.Resources.ResourceManager.GetObject(FormStrings.MyImageNames);
Bitmap myImage = (Bitmap)rm;
ImagePreview.Image = myImage;
5
Violator

私の場合 - 私は自分のリソースでアイコンを使っていましたが、いくつかのToolStripMenuItem(s)にImagesとして動的に追加する必要がありました。そのため、私が作成したメソッド(以下のコードスニペットの元となる場所)では、MenuItemに追加するためにアイコンリソースを返す前に、アイコンリソースをビットマップに変換する必要がありました。

string imageName = myImageNameStr;
imageName = imageName.Replace(" ", "_");
Icon myIcon = (Icon)Resources.ResourceManager.GetObject(imageName);
return myIcon.ToBitmap();

あなたがそれらをあなたのリソースに追加するときあなたのimage/iconが名前にスペース( "")を持っているならば、VSがそれらのスペースを自動的に "_"(s)に置き換えるでしょう。なぜなら、リソースに名前を付けるときにスペースは有効な文字ではないからです。私が参照しているコードでReplace()メソッドを使っているのはそのためです。あなたはおそらくその行を無視することができます。

5
DSmith

以下のものを使用してください。これをWindowsフォームのグリッドビューセルでテストしました。

Object rm = Properties.Resources.ResourceManager.GetObject("Resource_Image");
Bitmap myImage = (Bitmap)rm;
Image image = myImage;

"Resource_Image"の名前は、プロジェクトから見つけることができます。

プロジェクトの名前の下に、Propertiesがあります。それを展開してください。そこにResources.resxファイルがあります。それを開く。ファイル名を「Resource_Image」として付けます。

5
Dzero

JDSの答えは最もうまくいった。 C#のサンプル画像のロード:

  • 画像をリソースとして含める(プロジェクトツリー - >リソース、右クリックして望ましいファイルImageName.pngを追加します)
  • 埋め込みリソース(プロジェクトツリー - >リソース - > ImageName.png、右クリックでプロパティを選択)
  • .pngファイル形式(.bmp .jpgも問題ないはずです)

pictureBox1.Image = ProjectName.Properties.Resources.ImageName;

次の点に注意してください。

  • リソースイメージファイルは "ImageName.png"です。ファイル拡張子は省略してください。
  • ProjectNameはおそらく "アセンブリ名"としてより適切に理解されるかもしれません。これは、[プロジェクト] - > [プロパティ]ページのそれぞれのテキストエントリです。

サンプルコード行は、VisualStudio 2015 Communityを使用して正常に実行されています。

4
user3674642

私は提案します:

System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);

Msdnから: http://msdn.Microsoft.com/ja-jp/library/aa287676(v = vs.71).aspx

Image.FromStreamを使用すると、画像の形式(bmp、png、...)を知る必要がないため、より優れています。

4
Davide Icardi

このようにbmpをvarに保存することもできます。

var bmp = Resources.ImageName;

それが役に立てば幸い!

3
F.joksch

不思議なことに、デザイナーを覗いてみると、はるかに簡単な方法のように思えます。

画像は.Properties.Resourcesから入手できるようです。

私が興味を持っているのは、画像を貼り付けたコントロールに貼り付けることだけなので、単に画像を使用しています。

(ネット4.0、VS2010)

2
Loren Pechtel

私は自分のプロジェクトのひとつからデザイナーコードを見て、それがこの記法を使っているのに気づいた

myButton.Image = global::MyProjectName.Properties.Resources.max;

maxは、プロジェクトにアップロードしたリソースの名前です。

2
Andrew Stein

あるいは、WPFまたはSilverlightを扱うとき、特にソース文字列がすでにXAMLマークアップにある場合は、この行を使用できます。

(ImageSource)new ImageSourceConverter().ConvertFromString(ImagePath);

ImagePathは次のようになります。

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
1
TChadwick