Assign an external image to a Picturebox in Visual Studio 2008 (C#)? - c#

How can I assign an external image into the PictureBox in Visual Studio 2008 ?
Typically, When we use ChooseImage in PictureBox , Visual Studio adds the image to the exe file and it causes increasing exe file's volume, I wanna add the image from a directory beside the exe file.
Is it possible in Visual Studio 2008?
P.S:
I don't want add the image with C# code, because VS2008 doesn't show it in developing time.

I think you can do this in C# code using the Image.FromFile method. As long as the C# code is in the initialization of the form / control, it should run at both design time and run time.

You can use Linked resources.
When you add a linked resource, the
.resx file that stores your project
resource information includes only a
relative path to the resource file on
disk. If you add images, videos, or
other complex files as linked
resources, you can edit them using a
default editor that you associate with
that file type in the Resource
Designer. When you add an embedded
resource, the data is stored directly
in the project's resource (.resx)
file. Strings can only be stored as
embedded resources.embedded resources.
MSDN on Linked vs. Embedded Resources
P.S. I however still don't get why would you need it—even if .exe doesn't get bigger, the whole app package would have a bigger size, wouldn't it?
Best,
Dan

If this is WinForms, it's better to just set the ImageLocation of the PictureBox to the path to your image. Do this from the designer to have it show at design time.

You can get images from Resources
pictureBox1.Image = Properties.Resources.[image name];
see How to embed and access resources by using Visual C#
Misread the question OP asked to load without using the Resources.
you will need to do
Image.FromFile("c:\\image.bmp")
If image if a JPEG then You can cast it to Bitmap
Bitmap myJpeg=(Bitmap) Image.FromFile("myJpegPath");
OR,
System.Drawing.Image loadImg = System.Drawing.Image.FromFile("c:\\image.JPG");
loadImg.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

Related

Errors after changing tool strip button image

Once i add this line to the code:
this.tsbAdd.Image = Bitmap.FromFile(#"..\..\Resources\add.bmp");
I'm unable to open editor of that form.
Screenshot of designer
I can compile app and images work as they should.
Expected results - new image is displayed without breaking designer.
Real results - new image breaks designer.
Once i build it into .exe it doesn't open. Without images it works flawlessly.
Nope it won't. The picture will be built, but referencing it by this path won't be working.
The resource file WOULD be built into your exe, but not at "....\Resources\add.bmp". This path only exists in your IDE configuration position, when your program is at "bin\Debug", you understand me?
Imagine you put your exe into C:\, then where is "....\Resources"? You cannot refer to a image in this way.
You should add resources in the project panel (I believe you have done that), and the way you get this file is via ResourceManager, not using this path. Like this:
ResourceManager rm = Resources.ResourceManager;
this.tsbAdd.Image = (Image) rm.GetObject("add");
The resourcemanager will pull the resource bitmap out from your built exe. Just using that path won't work. As the designer is not ran in \bin\Debug, no wonder it is broken too because it cannot find your file using that path.

how can i assign external images which loads in both runtime & design time with relative path to where the exe is built?

I want to create a guide application using C# which contains screen shots , texts and links to other pages.
I know that later on I have to update the guide application with its images.
The application including images is arround 2 MBs for each language. so I want to update it with the differences.
The solution i was thinking of is having a simple exe with PNG files next to it.
So I just need to include the exe and the only PNG files that have changed in my update patch.
The exe loads PNG files using PictureBox.ImageLocation attribute with relative path to where the exe is built. it runs ok. everything is fine but in Visual Studio's Designer it fails to load the images. It shows a cross sign on the Picturebox. The ErrorImage. I want to keep it relative because I use several PCs or maybe a team for the future.
Here is a sample project:
https://www.dropbox.com/s/o20xzc96cv422g9/WindowsFormsApplication3.rar
Runtime:
Designer:
Works ok at runtime, fails at designer.
how can i assign external images which loads in both runtime & design time with relative path to where the exe is built?
Is there a better way to create low size patches?
The problem is fixed by putting the images inside the resources of many Class Library Projects. So the project can be divided to so many parts, each part has its own data that can be updated later with lower sizes.

How to compile all files to one exe?

I wrote a project in C# that uses a lot of images, Milk models and openGL and i want to pack everything in one exe so i can upload it to my site.
Right now i got an exe that is depended on other files like jpgs etc'.
I've tried using ILMerge but couldn't get it to work. Is there a simpler solution?
thanks.
You can put all your files/images into the exe as Embedded Resources.
See How to embed and access resources by using Visual C# (This link currently 404s)
Add that as an embedded resource.
Inside Visual Studio :
Go to Solution Explorer,
Right click the image,
GO to Build Actions: Select Embedded Resource.
You will have that image inside the exe. Later you can use Reflection and get the image when you run your application.
========= Getting the Embedded image from the Application =========
First solve the first problem: by putting images as embedded resource.
Second problem: Access the images by using Reflection:
private void Form1_Load(System.Object sender, System.EventArgs e)
{
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
Stream myStream = myAssembly.GetManifestResourceStream("EmbeddingExample.image1.bmp");
Bitmap image = new Bitmap(myStream);
this.ClientSize = new Size(image.Width, image.Height);
PictureBox pb = new PictureBox();
pb.Image = image;
pb.Dock = DockStyle.Fill;
this.Controls.Add(pb);
}
Borrowed Source Code from here:
ilmerge is only for merging .net CLR binaries together, usually for bundling libraries into your main executable.
For things like art assets, you want to embed them as resources into your application. From a resource you can get a stream which lets you work with the data as if it were in a file.
See this MSDN article for information on embedding resources: http://support.microsoft.com/kb/319292
When you add an image to the project in properties you can set it as Embedded Resource, then it'll be added to the binary file (dll or exe)
I shall prefer to create a satellite assembly for resource files. http://msdn.microsoft.com/en-us/library/21a15yht%28v=vs.71%29.aspx

How to manage icons in solution with several projects?

I have five projects in my solution. Each of them uses some icons (many of these icons are the same in the different projects) and I want to store them in one place.
I tried to use separate project for storing icons, but I got fiasco..
When I use icon from other project (project which contains all icons) Visual Studio automatically copied this icons to the form.resx file.
Explanation:
By the first I can't attach icon (from other project) to my button from designer. Therefore I must to go to the form.designer.cs and manually attach the icon to the button. After these operations VS rebuilt the auto-generated part in form.designer.cs replaced my code with own and copied the icon to the form.resx file.
//my code
this.btnCompile.Image = SharedProject.Properties.Resources.compile;
//code replaced with VS
this.btnCompile.Image = ( (System.Drawing.Image)( resources.GetObject( "compile.Image" ) ) );
You can see that image was copied to local project to the resources. In this case to change button's image is insufficient to replace only my image (compilation.png) in shared project. I need to replace also it in each form where it used.
Question: How to manage icons in solution to avoid duplication and this big inconvenience?
I've solved exactly the same problem but with one limitation. Let's see two possibilities:
1) You want to have ability to update all images by overriding one folder with images in app folder.
You can use Service as #Farzin Zaker suggested. The drawback of that solution is you have to dynamically set up images to controls and in design mode you will not see control with correct images.
2) You want to use Designer.
In that case you have to add those images as resources. The trick is to make VS use relative path to images from the specified folder. By default VS copies all resource files to project Resources folder. But if VS sees that in Resources folder "registered" other file with the same name VS stores in .resx relative path to image. So If you want to add the same image in two project you have to:
- Create folder Resources
- Add image as existing item (as link): in VS you will see the link to image, set action to None
- Add image to project resources section.
You can design a Service project witch will serve Icons or other resources for your other projects. you should just implement an interface like this in your application :
public interface IResourceProvider
{
Image RetrieveIcon(string key);
//you can add other resource types here.
}
then implement this interface in a new class and return related Icon to each key passed to its methods. here you need to browse resx file of this project for requested Icon (Resource)
then in you application you should just call your ResourceProvider class to priovide required resource Items.

VS Image Library .png files

Microsoft deploys free Image Library with Visual Studio.
At following location, you can find .png files which contain more than one icon in it.
c:\Program Files\Microsoft Visual Studio 9.0\Common7\VS2008ImageLibrary\1033\VS2008ImageLibrary_Common Elements\Actions\
Is there any way to access particular icon from file programmaticaly, or I have to edit those files in some photo-tool and save every icon separately ?
Edit:
.png files don't have more than one logical icon in it (.ico files can have)
.png icons shipped with VS Image library don't follow any kind of pattern so thay can not be easily utilised by code (mipmapping). They will have to be edited in some graphic tool and then saved to separated files
Icon files (can) contains several images inside of them but you don't need to extract them.
The idea is that at runtime the best icon is severed (like mipmaping in 3d).
If you use the Graphics.DrawIcon(Icon, Rectangle) then the best icon will be choose for you.
or you can use Paint.NET with the Icon addin to extract the exact size.

Categories