2016-09-14 4 views
-2

最初に、指定したフォルダから画像ボックスに画像(たとえば20画像)を読み込み、コンボボックスのドロップダウンから選択すると、通常画像ボックスに読み込まれます。画像ボックスに読み込まれた画像を消去する-c#

私が直面している問題は、処理する画像を取得するために次のフォルダを選択するときです。以前選択したフォルダの画像も、次のフォルダの画像のみが表示された後、ピクチャボックスに表示されます。以前にロードされたイメージ

具体的には、ドロップダウンからフォルダをクリックすると、特定のフォルダの画像がピクチャボックス内に表示されます。以前に読み込まれた画像は表示されません。 VS2013でC#で作業しています。

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     ArrayList alist = new ArrayList(); 
     int i = 0; 
     int filelength = 0; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 



     private void Form1_Load(object sender, EventArgs e) 
     { 
      DirectoryInfo di = new  DirectoryInfo(@"C:\Users\Arun\Desktop\scanned"); 
      DirectoryInfo[] folders = di.GetDirectories(); 
      comboBox1.DataSource = folders; 
     } 

     private void button7_Click(object sender, EventArgs e) 
     { 
      if (i + 1 < filelength) 
      { 
       pictureBox1.Image = Image.FromFile(alist[i + 1].ToString()); 
       i = i + 1; 
       pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
      } 
     } 

     private void button8_Click(object sender, EventArgs e) 
     { 

      if (i - 1 >= 0) 
      { 

       pictureBox1.Image = Image.FromFile(alist[i - 1].ToString()); 
       pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
       i = i - 1; 
      } 
     } 

     private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      string selected = comboBox1.SelectedItem.ToString(); 
      String fullpath = Path.Combine(@"C:\Users\Arun\Desktop\scanned", selected); 
      DirectoryInfo di1 = new DirectoryInfo(fullpath); 
      DirectoryInfo[] folders1 = di1.GetDirectories(); 
      comboBox2.DataSource = folders1; 

     } 

     private void button9_Click(object sender, EventArgs e) 
     { 

      string selected1 = comboBox1.SelectedItem.ToString(); 
      string selected2 = comboBox2.SelectedItem.ToString(); 

         //Initially load all your image files into the array list when form load first time 
      System.IO.DirectoryInfo inputDir = new System.IO.DirectoryInfo(Path.Combine(@"C:\Users\Arun\Desktop\scanned", selected1, selected2)); //Source image folder path 


      try 
      { 


       if ((inputDir.Exists)) 
       { 

        //Get Each files 
        System.IO.FileInfo file = null; 
        foreach (System.IO.FileInfo eachfile in inputDir.GetFiles()) 
        { 
         file = eachfile; 
         if (file.Extension == ".tif") 
         { 
          alist.Add(file.FullName); //Add it in array list 
          filelength = filelength + 1; 
         } 
         else if(file.Extension == ".jpg") 
         { 

          alist.Add(file.FullName); //Add it in array list 
          filelength = filelength + 1; 
         } 
        } 

        pictureBox1.Image = Image.FromFile(alist[0].ToString()); //Display intially first image in picture box as sero index file path 
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
        i = 0; 

       } 
      } 
      catch (Exception ex) 
      { 

      } 

     } 

     private void Form1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if(e.KeyCode == Keys.D) 
      { 
       if (i + 1 < filelength) 
       { 
        pictureBox1.Image = Image.FromFile(alist[i + 1].ToString()); 
        i = i + 1; 
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
       } 
      } 
      else if(e.KeyCode == Keys.A) 
      { 
       if (i - 1 >= 0) 
       { 

        pictureBox1.Image = Image.FromFile(alist[i - 1].ToString()); 
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
        i = i - 1; 
       } 
      } 
     } 


     private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) 
     { 

     } 

    } 
} 
+0

ようこそ[ようやく]を読んで、何を試してみましたか – Prisoner

+1

私の簡単なGoogle検索から、ここに提案があります。新しい画像を読み込む前に 'pictureBox.Image = null;'を試してください。 –

+0

picturebox1.image = nullで正常に動作しません。 @ KeyurPATEL – warriors

答えて

1

あなたのコードは多く問題があります。

あなたが探しているのは、新しいファイル名をロードする前にalistをクリアしないということです。

ので挿入します

//Get Each files 

そしてまたループの後

filelength = alist.Count; 

alist.Clear(); 

を。追加中に数える必要はありません!

ArrayListはかなりdepracatedされ、あなたの代わりに、タイプセーフと強力なList<T>を使用する必要があることに注意してください:もちろん

List<string> alist = new List<string>(); 

iという名前のクラス変数は愚かであり、あなたはまた、常に持つに依存していますcomboBox2のSelectedItem

イメージを適切に廃棄していないため、GDIリソースが漏洩しています。

あなたが適切に画像をロードするため、この機能を使用することができます

void loadImage(PictureBox pbox, string file) 
{ 
    if (pbox.Image != null) 
    { 
     var dummy = pbox.Image; 
     pbox.Image = null; 
     dummy.Dispose(); 
    } 
    if (File.Exists(file)) pbox.Image = Image.FromFile(file); 
} 

それは最初Imageへの参照を作成しますが、その後、PictureBoxの参照をクリアし、その後、ImageDisposeへの参照を使用して、最後にしようとします新しいものをロードする。

関連する問題