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


212

Resources / myimage.jpgに保存されているプロジェクトの画像があります。この画像をビットマップオブジェクトに動的に読み込むにはどうすればよいですか?



これは、後に尋ねられた質問でしたが、いない重複した場合、関連している: stackoverflow.com/questions/13592150/load-image-from-resources
vapcguy

回答:


242

Windowsフォームを使用していますか?プロパティ/リソースUIを使用して画像を追加した場合は、生成されたコードから画像にアクセスできるので、これを簡単に行うことができます。

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

いいえ、それは普通のファイルとしてフォルダResourcesに追加されます。
Pavel Bastov、2009

9
ああ。その場合、@ Hallgrimがリソースストリームを使用して答えを見つけたと思います。Windowsフォームを使用している場合、画像を削除してUIから再度追加することをお勧めします。
マットハミルトン

114

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

Image myImage = Resources.myImage;

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

Bitmap bmp = new Bitmap(Resources.myImage);

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

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

ResourceManagerの利点は、Resources.myImageが通常はスコープ外にある場合や、リソースに動的にアクセスする場合に使用できることです。さらに、これはサウンド、設定ファイルなどで機能します。


17
注:Properties.Resources.myImageを使用してください。
splattne 2010年

リソースオブジェクトをデータグリッドにバインドしようとしていますが、メソッドを使用しても表示されません。datagrid image列はテンプレート化されています。
alice7

70

リソースストリームからロードする必要があります。

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);
}

29
リフレクションを使用する必要はありません。これは、より簡単な方法が利用できることを考えると、非常に複雑に見えます。
チャーリーソルト

このソリューションはC#では機能しません/ Windows Phone .NETCF --GetManifestResourceNames()は単一の名前(アセンブリDLLモジュールの名前)のみを返します。マニフェストで使用できるリソースは1つだけです。DLLモジュールのストリームblobです。C ++と安全でないコードを使用してWin32 API呼び出しを呼び出すことができない場合、率直に言って、このメモリのチャンクを処理するのはお尻の王室の苦痛です。
マークジョーンズ

2
typeof(this).Assemblyショートパンツとしてもお使いいただけます。
スリハルシャチラカパティ2013

1
@SriHarshaChilakapati typeof(this)は動作しません。this.GetType().Assemblyはあなたが言ったことに最も近いですが、別のアセンブリにある可能性のある継承されたスーパークラスをピックアップするため、危険です。
John Gibb

2
@SriHarshaChilakapati typeof(this);はコンパイルされません。あなたが得るError 1 Type expected
ジョンギブ14年

26

提案されたほとんどすべての回答よりもはるかに簡単

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

1
OPがファイルとして追加されただけであることをOPが明確に示しているため、ファイルがリソースマニフェストの一部でない場合は、その方法でアクセスできません。
2016年

1
彼は、Bitmapオブジェクトではなくオブジェクトも欲しがっていましたImage
vapcguy 2017年

13

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

    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);

    }

13

プロジェクトのリソース設定で画像リソースとして追加するのが一番です。次に、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は、アセンブリにある任意のタイプです。


1
「namespace」は変数名として使用できません。MyTypeFromSameAssemblyAsResourceに到達する方法を教えてください。
Jason Fuerstenberg、2012

Jasonの問題に対処するタイプミスを修正しました
John Gibb

6

以下のいずれかを使用します。これをWindowsフォームのグリッドビューセルでテストしました。

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

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

プロジェクト名の下に、がありますProperties。それを展開します。そこでResources.resxファイルを見ることができます。それを開く。ファイル名を「Resource_Image」として適用します。


5

「ImagePreview FormStrings.MyImageNames」という名前のImageBoxには、スクロールボックスタイプリストにリンクされている通常のget / set文字列キャストメソッドが含まれています。画像の名前は、.bmpの末尾を除いて、リスト上のリンクされた名前と同じです。すべてビットマップはresources.resxにドラッグされます

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

5

私の場合- リソースでアイコンを使用していましたが、次のように動的に追加する必要がありました画像をいくつかにToolStripMenuItem(複数可)。したがって、私が作成したメソッド(以下のコードスニペットのソース)では、アイコンリソースをビットマップに変換してから、に追加する必要がありましたMenuItem

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

リソース/イメージに追加するときに、イメージ/アイコンの名前にスペース( "")が含まれている場合、VSはそれらのスペースを自動的に "_"(s)に置き換えます。リソースに名前を付ける場合、スペースは有効な文字ではないためです。これがReplace()、参照コードでメソッドを使用している理由です。あなたはおそらくその行を無視することができます。


5

私は提案します:

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/en-us/library/aa287676(v=vs.71).aspx

画像の形式(bmp、png、...)を知る必要がないため、Image.FromStreamを使用する方が適切です。


5

JDSの回答が最も効果的でした。画像をロードするC#の例:

  • 画像をリソースとして含めます(プロジェクトツリー->リソース、右クリックして目的のファイルImageName.pngを追加)
  • 埋め込みリソース(プロジェクトツリー->リソース-> ImageName.png、右クリックしてプロパティを選択)
  • .pngファイル形式(.bmp .jpgも問題ありません)

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

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

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

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


4

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

var bmp = Resources.ImageName;

それが役に立てば幸い!


2

不思議なことに、デザイナーを突っ込んでみると、はるかにシンプルなアプローチのように思えます。

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

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

(ネット4.0、VS2010。)


2

私は自分のプロジェクトの1つからデザイナーコードを見て、この表記法を使用していることに気付きました

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

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


1

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

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

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

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

-1
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(444, 25);
this.toolStrip1.TabIndex = 0;
this.toolStrip1.Text = "toolStrip1";
object O = global::WindowsFormsApplication1.Properties.Resources.ResourceManager.GetObject("best_robust_ghost");

ToolStripButton btn = new ToolStripButton("m1");
btn.DisplayStyle = ToolStripItemDisplayStyle.Image;
btn.Image = (Image)O;
this.toolStrip1.Items.Add(btn);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.