[Last Call] Learn how to a build a cloud-first strategyRegister Now


How to implement over 1000 images into C# application.

Posted on 2004-08-03
Medium Priority
Last Modified: 2010-04-15
I have to make an application that is some kind of catalog, and the main feature of the application is to showing bunch of product’s images on Windows Forms.
I just wonder how I should implement this feature, I mean what is the best way to store images. Should I use resource file in order to store these, images, or there is better way to access images in C#. I want also prevent users from changing these images.
Since there are over 1000 images (each picture is about 50 –150KB), it is impassible to use embedded resources.

I have problem with Windows Forms as well. The application will require over 80 Windows Forms. Since I can’t use inheritance at least not for each Form, is there good practice to use dll files for these Forms, and call it form main form?

I will appreciate any ideas!!
Question by:knobloch

Expert Comment

ID: 11712006
Best is keep the files on the hard drive and display images using picturebox control at run time.
You could have pictures names in sequence and display the images based on the number
this.pictureBox1.Image = System.Drawing.Image.FromFile(@"C:\1.jpg");

This is easiest extensible plus your application don't need to save the images in itself.

S Sansanwal

Author Comment

ID: 11712191
In this case users could edit or delete images easily. I'm not crazy about application security, but people sometime do things that they are not supposed to do.

LVL 20

Accepted Solution

TheAvenger earned 500 total points
ID: 11713164
If you have such a complex application, I would suggest to think in two directions: performance and ease of maintanance/future development. So I would make it like this:

- Put the image files in resource dlls, however split them logically in several dlls (1000 files, each about 150 Kb is 150 Mb and if it is in one file, it will be slow and difficult to manage). The users can still change the pictures if they have enough experience/knowledge to work with resource files. But hey, even if you encrypt them, it is still possible to change them, it will only be harder. So it is important how much you want to secure the images. I think putting them in a resource is good

- Put the forms also in DLLs. Split them as well logically, so that you end up with small dlls that are easier to manage (and probably faster to load). Still have in mind inheritance. Maybe you will have several base forms -> put them in a base dll which you will reference from the others. The problem with dlls is that you reach a level, where you need to reference dll 1 from dll 2 and dll 2 from dll 1, which is not possible. So spend some time to plan the dlls, but don't put everything in a huge 100 Mb exe...
LVL 22

Expert Comment

ID: 11716432

Okay... there are a ton of things you can do here.  It all really depends on what you *really* want/need.

Personally, I would put all of the pictures into a single directory and have security lock it down so none of the users have access to that directory.  I would then Place all of my descriptions to those pictures into the advanced properties of the file.  That way the image and the text you want to display are all in one place.

here are some other options as well:

Do you just want to show a list of pictures and their descriptions?

One solution might be to use a panel control, and then dynamically add picture boxes for each of your pictures.

Here's some sample code (dynamic pictureboxes loaded into a scrolling panel, with dynamic labels).

<button click event>
         PictureBox[] p = new PictureBox[7];
         Label[] l = new Label[7];
         panel2.AutoScroll = true;

         for(int i=0;i<6;i++)

            p[i] = new PictureBox();
            p[i].Image = Image.FromFile(@"C:\temp\test" + (i+1) + ".gif");
            p[i].Location = new Point(i*p[i].Image.Width+10,50);
            p[i].Size = new Size(p[i].Image.Width,p[i].Image.Height);

            l[i] = new Label();
            l[i].Text= "test" + (i+1) + ".gif";
            l[i].Location = new Point(i*p[i].Image.Width+10,10);
            l[i].Size = new Size(p[i].Image.Width,15);


As for the pictures themselves.  I'd only reccomend a a ResX file *ONLY* if the pictures were not going to change very often.  Otherwise you need to recreate the resex file every time.  I suppose you could do it in code, but that would take work.  Here is some code I use for creating ResX files.  Very quick and simple.. the form itself has two buttons and 1 label.

using System;
using System.IO;
using System.Resources;
using System.Windows.Forms;

namespace JSI.TAD.CreateResXFiles
      public class ResX
            private static string[] sourceFiles;
            private static FileInfo[] files;

            /// <summary>
            /// Uses Open File Dialog to get files
            /// </summary>
            public static void GetSourceFiles()
                  // User file navigation
                  OpenFileDialog fd = new OpenFileDialog();
                  fd.Multiselect = true;

                  // retrieve files
                  if(fd.ShowDialog() == DialogResult.OK)
                        sourceFiles = fd.FileNames;

                        // Save File Information
                        files = new FileInfo[sourceFiles.Length];
                        for(int i=0;i<files.Length;i++)
                              files[i] = new FileInfo(sourceFiles[i]);

            /// <summary>
            /// Uses SaveFileDialog to create resx file
            /// </summary>
            public static void WriteSourceFiles()
                  if(files!=null && files.Length>0)
                        // Create SaveFileDialog
                        SaveFileDialog sd = new SaveFileDialog();
                        sd.Filter = "ResX Files (*.resx)|*.resx|Resource Files (*.resource)|*.resource";
                        sd.FileName = "resFile1";
                              Stream myStream;

                              // Generate File if filename given
                              if((myStream = sd.OpenFile()) != null)
                                    ResXResourceWriter rw = new ResXResourceWriter(myStream);
                                    FileStream str;
                                    byte[] buff;

                                    // Load files into res file
                                    for(int i=0;i<files.Length;i++)
                                          str = new FileStream(files[i].FullName,FileMode.Open);
                                          buff = new byte[(int)str.Length];

                                          rw.AddResource(files[i].Name, buff);
                                    // generates res file

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
As many of you are aware about Scanpst.exe utility which is owned by Microsoft itself to repair inaccessible or damaged PST files, but the question is do you really think Scanpst.exe is capable to repair all sorts of PST related corruption issues?
Suggested Courses

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question