Eu tenho uma imagem no meu projeto armazenada em Resources / myimage.jpg. Como posso carregar dinamicamente essa imagem no objeto Bitmap?
Eu tenho uma imagem no meu projeto armazenada em Resources / myimage.jpg. Como posso carregar dinamicamente essa imagem no objeto Bitmap?
Respostas:
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);
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.
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);
}
typeof(this).Assembly
para abreviar.
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.
typeof(this);
não compila. Você recebeError 1 Type expected
Muito mais fácil do que a maioria das respostas propostas
tslMode.Image = global::ProjectName.Properties.Resources.ImageName;
Bitmap
objeto, não um Image
objeto.
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);
}
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.
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.resx
arquivo. Abra. Aplique o nome do arquivo como "Resource_Image".
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;
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.
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, ...).
A resposta da JDS funcionou melhor. Exemplo de C # carregando imagem:
pictureBox1.Image = ProjectName.Properties.Resources.ImageName;
Observe o seguinte:
A linha de código de exemplo é executada com sucesso usando a Comunidade do VisualStudio 2015.
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.)
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.
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";
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);