2011-12-12 2 views
0

오류가 라인에 이유를 파악하지 못할 붙 잡혔다 :일반 오류는 GDI에서 발생 + ExternalException은

for (int x = 0; x < myList.Count(); x++) 

x++은 녹색으로 색칠한다.

나는 백그라운드 워커를 사용하고 있기 때문에 배경 작업자가 없기 전에이 코드를 다른 형식으로 사용했습니다. 이제 다른 양식에서 클릭 버튼 이벤트를 사용하여 show()이 양식을 작성하고 progressBar1을 사용하여 backgroundowrker 작업의 진행 상황을 표시하고 싶습니다.

지금은이 for 루프를 사용해보고 catch 지점으로 가서 오류를 보였습니다. 전체 예외 메시지는 다음과 같습니다

at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams) 
at System.Drawing.Image.Save(String filename, ImageFormat format) 
at mws.Animation_Radar_Preview.backGroundWorker1_DoWork(Object sender, DoWorkEventArgs e) in D:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Animation_Radar_Preview.cs:line 163 

gifImages isnt null. 

이이 양식의 전체 코드입니다 : 나는이 같은 코드는 이전 일을 말한다 특히, 잘못 무슨 일이 일어나고 있는지 전혀 모르겠어요

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using DannyGeneral; 
using unfreez_wrapper; 


namespace mws 
{ 
    public partial class Animation_Radar_Preview : Form 
    { 
     int mtpStart; 
     int mtpEnd; 
     Picturebox1_Fullscreen pb1; 
     string radar_images_download_directory; 
     string tempRadarPngToGifDirectory; 
     int numberOfFiles; 
     UnFreezWrapper unfreez; 
     string path_exe; 
     List<string> myList; 
     string previewDirectory; 
     int animatedGifSpeed; 
     bool loop; 
     string nameOfStartFile; 
     string nameOfEndFile; 
     string previewFileName; 
     BackgroundWorker backGroundWorker1; 
     Image img; 
     private MemoryStream _memSt = null; 
     public Animation_Radar_Preview() 
     { 
      InitializeComponent(); 
      mtpStart = Picturebox1_Fullscreen.mtp1Start; 
      mtpEnd = Picturebox1_Fullscreen.mtp1End; 
      animatedGifSpeed = Picturebox1_Fullscreen.animatedSpeed; 
      loop = Picturebox1_Fullscreen.looping; 
      pb1 = new Picturebox1_Fullscreen(); 
      radar_images_download_directory = Options_DB.Get_Radar_Images_Download_Directory(); 
      path_exe = Path.GetDirectoryName(Application.LocalUserAppDataPath); 
      tempRadarPngToGifDirectory = path_exe + "\\" + "tempRadarPngToGifDirectory"; 
      if (Directory.Exists(tempRadarPngToGifDirectory)) 
      { 
      } 
      else 
      { 
       Directory.CreateDirectory(tempRadarPngToGifDirectory); 
      } 
      previewDirectory = path_exe + "\\" + "previewDirectory"; 
      if (Directory.Exists(previewDirectory)) 
      { 
      } 
      else 
      { 
       Directory.CreateDirectory(previewDirectory); 
      } 
      previewFileName = previewDirectory + "\\" + "preview.gif"; 
      loop = false; 
      animatedGifSpeed = 0; 
      unfreez = new UnFreezWrapper(); 
      backGroundWorker1 = new BackgroundWorker(); 
      backGroundWorker1.WorkerSupportsCancellation = true; 
      this.backGroundWorker1.WorkerReportsProgress = true; 
      backGroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backGroundWorker1_ProgressChanged); 
      backGroundWorker1.DoWork += new DoWorkEventHandler(backGroundWorker1_DoWork); 
      backGroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backGroundWorker1_RunWorkerCompleted); 
      backGroundWorker1.RunWorkerAsync(); 
      progressBar1.Value = 0; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      DialogResult result1; 
      result1 = new DialogResult(); 
      SaveFileDialog sd = new SaveFileDialog(); 
      sd.Title = "Select a folder to save the animated gif to"; 
      sd.InitialDirectory = "c:\\"; 
      sd.FileName = null; 
      sd.Filter = "Gif File|*.gif;*.jpg|Gif|*.gif"; 
      sd.FilterIndex = 1; 
      sd.RestoreDirectory = true; 
      result1 = sd.ShowDialog(); 
      string file1 = sd.FileName; 
      if (result1 == DialogResult.OK) 
      { 
       File.Move(previewFileName, file1); 
      } 
     } 

     public void pictureBoxImage(string pbImage) 
     { 
      Image img2 = null; 
      try 
      { 
       using (img = Image.FromFile(pbImage)) 
       { 
        //get the old image thats loaded from the _memSt memorystream 
        //and dispose it 
        Image i = this.pictureBox1.Image; 
        this.pictureBox1.Image = null; 

        if (i != null) 
         i.Dispose(); 

        //grab the old stream 
        MemoryStream m = _memSt; 

        //save the new image to this stream 
        _memSt = new MemoryStream(); 
        img.Save(_memSt, System.Drawing.Imaging.ImageFormat.Gif); 

        if (m != null) 
         m.Dispose(); 

        //create our image to display 
        img2 = Image.FromStream(_memSt); 
       } 

       if (img2 != null) 
        pictureBox1.Image = img2; 
       label2.Text = numberOfFiles.ToString(); 
       label6.Text = nameOfStartFile.ToString(); 
       label4.Text = nameOfEndFile.ToString(); 
       //File.Delete(pbImage); 
      } 
      catch(Exception err) 
      { 
       Logger.Write("Animation Error >>> " + err); 
      } 
     } 

     private void backGroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar1.Value = e.ProgressPercentage; 
     } 

     private void backGroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      List<string> myGifList; 
      Image gifImages = null; 
      //button1.Enabled = false; 
      Animation_Radar_Preview ap = new Animation_Radar_Preview(); 
      //ap.FormClosing += new FormClosingEventHandler(ap_FormClosing); 
      FileInfo[] fi; 
      DirectoryInfo dir1 = new DirectoryInfo(radar_images_download_directory); 
      fi = dir1.GetFiles("*.png"); 
      myList = new List<string>(); 
      myGifList = new List<string>(); 
      for (int i = mtpStart; i < mtpEnd; i++) 
      { 
       myList.Add(fi[i].FullName); 
      } 
      for (int x = 0; x < myList.Count(); x++) 
      { 
       try 
       { 
        gifImages = Image.FromFile(myList[x]); 
        gifImages.Save(tempRadarPngToGifDirectory + "\\" + x.ToString("D6") + ".Gif", System.Drawing.Imaging.ImageFormat.Gif); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(x.ToString() + "\r\n" + (gifImages == null).ToString() + "\r\n" + ex.Message); 
       } 
      } 

      myGifList = new List<string>(); 
      dir1 = new DirectoryInfo(tempRadarPngToGifDirectory); 
      fi = dir1.GetFiles("*.gif"); 
      nameOfStartFile = fi[0].Name; 
      for (int i = 0; i < fi.Length; i++) 
      { 
       myGifList.Add(fi[i].FullName); 
       //backGroundWorker1.ReportProgress(i); 
       nameOfEndFile = fi[i].Name.Length.ToString(); 
      } 
      numberOfFiles = myGifList.Count(); 
      unfreez.MakeGIF(myGifList, previewFileName, animatedGifSpeed, loop); 
      /*this.Invoke((MethodInvoker)delegate 
      { 
       pictureBoxImage(previewFileName); 
      });*/ 
     } 

     private void backGroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      pictureBoxImage(previewFileName); 
     } 
    } 
} 
+1

Save() 호출 후 gifImages.Dispose()를 잊어 버렸습니다. 파일에 대한 잠금을 해제하는 데 필요합니다. –

답변

1

- 동일한 이미지 세트로 작업했는지 여부는 분명하지 않습니다.

여하튼는 Save 방법 the documentationExternalException이 두 가지 상황 중 하나에 던져 질 것이다 말한다 :

  1. 이미지가 잘못된 형식으로 저장되었습니다.
  2. 이미지는 이미지를 만든 파일에 저장됩니다.

확장자를 변경했기 때문에 파일을 저장할 수 없으므로 잘못된 형식이어야합니다. 이것이 실제로 의미하는 바는 분명하지 않습니다. 아마도 원본 이미지 중 하나가 GIF로 변환 할 수없는 PNG 형식의 기능을 사용하고 있습니다. 알파 채널 투명성.

너무 다른 제안을 만들기 위해 시간이 걸릴 수 있습니다 경우

if (!Directory.Exists(tempRadarPngToGifDirectory) 
{ 
    Directory.CreateDirectory(tempRadarPngToGifDirectory); 
} 

코드 파일을 조작 : 당신이 논리를 반전하는 경우

if (Directory.Exists(tempRadarPngToGifDirectory)) 
{ 
} 
else 
{ 
    Directory.CreateDirectory(tempRadarPngToGifDirectory); 
} 

빈 '성공'의 경우는 필요하지 않습니다 다음과 같은 경로 :

tempRadarPngToGifDirectory = path_exe + "\\" + "tempRadarPngToGifDirectory"; 

Path이 클래스는 가장자리 케이스를보다 잘 처리하고 이식성이 뛰어난 코드를 작성합니다.

tempRadarPngToGifDirectory = Path.Combine(path_exe, "tempRadarPngToGifDirectory"); 
+0

동의 - 이미지를 저장할 수없는 파일 형식으로 이미지를 저장하려고하면이 오류가 발생합니다. – dash

+0

png를 gif로 변환 할 수 있습니까? 아니면 다른 방법으로 저장하고 저장해야합니까? –

+0

아마도 특정 PNG 파일이 .NET Image 클래스가 알파 채널 투명도 나 애니메이션 등과 같이 변환 할 수없는 몇 가지 고급 기능을 사용하고 있음을 제안합니다. 보기에 문제가있는 이미지를 보았습니까? 그것에 대해 특별한 것이 있는지 확인하십시오. –

관련 문제