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

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.


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

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;

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

    }

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.


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".


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;

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.


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, ...).


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.


4

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

var bmp = Resources.ImageName;

espero que ajude!


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


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.


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

-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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.