Carregar imagem da área de recursos do projeto em C #

Respostas:

242

Você está usando o Windows Forms? Se você adicionou a imagem usando a interface do usuário Propriedades / Recursos, obtém acesso à imagem a partir do código gerado, para fazer isso simplesmente:

var bmp = new Bitmap(WindowsFormsApplication1.Properties.Resources.myimage);
Matt Hamilton
fonte
Não, ele é adicionado como um arquivo simples na pasta Recursos.
Pavel Bastov
9
Ah ok. Nesse caso, acho que o @ Hallgrim tem a resposta para você usando fluxos de recursos. Se você estiver usando o Windows Forms, sugiro que você exclua a imagem e a adicione novamente da interface do usuário - muito mais fácil.
Matt Hamilton
114

Você pode obter uma referência à imagem da seguinte maneira:

Image myImage = Resources.myImage;

Se quiser fazer uma cópia da imagem, faça o seguinte:

Bitmap bmp = new Bitmap(Resources.myImage);

Não se esqueça de descartar o bmp quando terminar. Se você não souber o nome da imagem do recurso em tempo de compilação, poderá usar um gerenciador de recursos:

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

O benefício do ResourceManager é que você pode usá-lo onde Resources.myImage normalmente estaria fora do escopo ou onde você deseja acessar dinamicamente os recursos. Além disso, isso funciona para sons, arquivos de configuração etc.

Charlie Salts
fonte
17
Nota: use Properties.Resources.myImage;
splattne
Estou tentando vincular o objeto de recurso ao meu datagrid, mas ele não está aparecendo usando seu método. A coluna da imagem da grade de dados é padronizada.
alice7
70

Você precisa carregá-lo do fluxo de recursos.

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

Se você deseja conhecer todos os nomes de recursos em sua montagem, vá com:

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

foreach (string one in all) {
    MessageBox.Show(one);
}
Josip Medved
fonte
29
Você não precisa usar a reflexão - isso parece muito complicado, considerando os métodos mais simples disponíveis.
30809 Charlie Salts
Esta solução não funciona em C # / Windows Phone .NETCF --GetManifestResourceNames () retorna apenas um único nome, o nome do módulo assembly-DLL. Há apenas um recurso disponível no manifesto - o blob de fluxo do módulo DLL. Sem C ++ e código inseguro que permitem que você faça chamadas à API do Win32, é francamente um problema real trabalhar com esse pedaço de memória.
Mark Jones
2
Você também pode usar typeof(this).Assemblypara abreviar.
Sri Harsha Chilakapati
1
@SriHarshaChilakapati typeof(this)não funcionará. this.GetType().Assemblyé o mais próximo do que você disse, mas é arriscado porque ele pega uma superclasse herdada que pode estar em uma montagem diferente.
John Gibb
2
@SriHarshaChilakapati typeof(this);não compila. Você recebeError 1 Type expected
John Gibb
26

Muito mais fácil do que a maioria das respostas propostas

tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
JDS
fonte
1
Não é possível acessar dessa maneira se o arquivo não fizer parte dos manifestos de recursos, pois o OP afirma claramente que foi adicionado como um arquivo.
Wobbles
1
Ele também queria um Bitmapobjeto, não um Imageobjeto.
vapcguy
13

Código que uso em vários de meus projetos ... Pressupõe que você armazene imagens no recurso apenas como bitmaps e não ícones

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

    }
Gary Kindel
fonte
13

O melhor é adicioná-los como recursos de imagem nas configurações de recursos no projeto. Em seguida, você pode obter a imagem diretamente fazendo Resources.myimage. Isso obterá a imagem através de uma propriedade C # gerada.

Se você acabou de definir a imagem como Recurso incorporado, poderá obtê-la com:

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

Onde MyTypeFromSameAssemblyAsResource é qualquer tipo que você possui no seu assembly.

Hallgrim
fonte
1
"namespace" não pode ser usado como nome de variável e como você chegará a MyTypeFromSameAssemblyAsResource seria apreciado.
Jason Fuerstenberg
fixa o erro de digitação abordando questão de Jason
John Gibb
6

Use abaixo de um. Eu testei isso com a célula de exibição de grade do formulário do Windows.

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

Nome de "Resource_Image", você pode encontrar no projeto.

Sob o nome do projeto, você pode encontrar Properties. Expanda. Lá você pode ver o Resources.resxarquivo. Abra. Aplique o nome do arquivo como "Resource_Image".

Dzero
fonte
5

With e ImageBox chamado "ImagePreview FormStrings.MyImageNames contém um método regular de conversão de seqüência de caracteres get / set, vinculado a uma lista de tipos de caixas de rolagem. As imagens têm os mesmos nomes que os nomes vinculados na lista, exceto as terminações .bmp. bitmaps são arrastados para os resources.resx

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

No meu caso - eu estava usando ícones em meu recurso, mas precisava adicioná-los dinamicamente como imagens a alguns ToolStripMenuItem. Portanto, no método que eu criei (que é de onde vem o trecho de código abaixo), tive que converter os recursos do ícone em bitmaps antes de poder devolvê-los para adicionar ao meu MenuItem.

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

Outra coisa a ter em atenção, se a sua imagem / ícone tiver espaços ("") em seu nome quando você os adicionar ao seu recurso, o VS substituirá automaticamente esses espaços por "_" (s). Porque, os espaços não são um caractere válido ao nomear seu recurso. É por isso que estou usando o Replace()método no meu código referenciado. Você provavelmente pode simplesmente ignorar essa linha.

DSmith
fonte
5

Eu sugiro:

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

Do msdn: http://msdn.microsoft.com/en-us/library/aa287676(v=vs.71).aspx

Usar Image.FromStream é melhor porque você não precisa saber o formato da imagem (bmp, png, ...).

Davide Icardi
fonte
5

A resposta da JDS funcionou melhor. Exemplo de C # carregando imagem:

  • Inclua a imagem como Recurso (Árvore do projeto-> Recursos, clique com o botão direito do mouse para adicionar o arquivo desejável ImageName.png)
  • Recurso incorporado (Árvore do projeto-> Recursos-> ImageName.png, clique com o botão direito do mouse em selecionar propriedades)
  • Formato de arquivo .png (.bmp .jpg também deve estar OK)

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

Observe o seguinte:

  • O arquivo de imagem do recurso é "ImageName.png", a extensão do arquivo deve ser omitida.
  • Talvez o ProjectName possa ser entendido mais adequadamente como "Nome da montagem", que deve ser a respectiva entrada de texto na página Projeto-> Propriedades.

A linha de código de exemplo é executada com sucesso usando a Comunidade do VisualStudio 2015.

user3674642
fonte
4

Você também pode salvar o bmp em um var como este:

var bmp = Resources.ImageName;

espero que ajude!

F.joksch
fonte
2

Estranhamente, ao cutucar o designer, encontro o que parece ser uma abordagem muito mais simples:

A imagem parece estar disponível em .Properties.Resources.

Estou simplesmente usando uma imagem, pois tudo o que me interessa é colá-la em um controle com uma imagem nela.

(Net 4.0, VS2010.)

Loren Pechtel
fonte
2

Olhei o código do designer de um dos meus projetos e notei que ele usava essa notação

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

onde max é o nome do recurso que carreguei no projeto.

Andrew Stein
fonte
1

Ou você pode usar esta linha ao lidar com o WPF ou o Silverlight, especialmente onde você já tem a cadeia de origem na marcação XAML:

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

Onde o ImagePath é algo como:

string ImagePath  = "/ProjectName;component/Resource/ImageName.png";
TChadwick
fonte
-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);
Programador de IR
fonte