如何在最后一个之前使用图像文件?

时间:2014-02-25 06:39:31

标签: c# winforms

在这段代码中,我得到的最后一个图像文件是5723图像:

i = last_image_file();
Next_File = sf + @"\radar" + i.ToString("D6") + ".png";
pictureBox1.Load(Next_File);

在这种情况下,最后一个文件是:radar005723.png 现在的问题是,文件是由于互联网连接问题而没有正确装载,但在这种情况下,我认为我的电脑卡住冻结的问题,我重新启动电脑,因此下载未完成或文件损坏。

如何在我的代码中添加一些能够在此代码之前检查图像文件的内容,以及是否是在pictureBox1中显示它的好文件?并且最后一个文件之前的文件也被损坏,所以请检查之前的文件,直到找到最后一个正常/好的文件。

然后删除所有损坏的图像。

编辑**

我已将代码更改为:

我的项目中已经有一个方法可以测试坏文件,所以我做了:

i = last_image_file();
Next_File = sf + @"\radar" + i.ToString("D6") + ".png";
bad_file = Bad_File_Testing(Next_File);

if (bad_file == true)
{
    File.Delete(Next_File);
}
else
{
    pictureBox1.Load(Next_File);
}    

但是bad_file不是真的所以它继续使用pictureBox1.Load(Next_File);并继续抛出异常:参数无效 我还尝试使用程序Paint加载文件,它无法加载文件,所以我知道文件很糟糕,但为什么方法:Bad_File_testing没有返回true?

这是Bad_File_Testing方法:

private bool Bad_File_Testing(string file_test)
{    
    try
    {
        Image radar = Bitmap.FromFile(bad_file_test_dir + testing_file);
        radar.Dispose();
        return true;     
    }
    catch
    {
        Logger.Write("Last radar image was damaged and have been deleted");
        return false; 
    }
}

例外:

System.ArgumentException was unhandled
  HResult=-2147024809
  Message=Parameter is not valid.
  Source=System.Drawing
  StackTrace:
       at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
       at System.Windows.Forms.PictureBox.Load()
       at System.Windows.Forms.PictureBox.Load(String url)
       at mws.Form1.show_latest_downloaded_image() in d:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Form1.cs:line 1862
       at mws.Form1..ctor() in d:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Form1.cs:line 467
       at mws.Program.Main() in d:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\Program.cs:line 25
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

这就是我如何使用Georgi方法:

i = last_image_file();
                    Next_File = sf + @"\radar" + i.ToString("D6") + ".png";
                    bool bad_file = IsValidGDIPlusImage(Next_File);

                    if (bad_file == true)
                    {
                        File.Delete(Next_File);
                    }
                    else
                    {
                        pictureBox1.Load(Next_File);
                    }

3 个答案:

答案 0 :(得分:1)

我认为您在Bad_File_Testing方法中测试错误的文件逻辑时出错了。此方法should return TRUE when it cannot open the file successfully, thus goes in the catch clauseshould return FALSE when it can open the file successfully。所以更正后的代码如下:

private bool Bad_File_Testing(string file_test)
{    
    try
    {
        Image radar = Bitmap.FromFile(file_test); // argument value used
        radar.Dispose();
        return true;     
    }
    catch
    {
        Logger.Write("Last radar image was damaged and have been deleted");
        return false; 
    }
}

修改

请查看以下代码:

bool hasValidImage = false;
while(true)
{
    i = last_image_file();
    Next_File = sf + @"\radar" + i.ToString("D6") + ".png";
    bad_file = Bad_File_Testing(Next_File);

    if (bad_file == true)
    {
        File.Delete(Next_File);
    }
    else
    {
        hasValidImage = true;
        break;
    }  
}

if(hasValidImage)
{
    pictureBox1.Load(Next_File);
}

它将起作用:如果它是错误的并且在删除文件之后它会检查删除文件之前的最后一个文件,如果这个文件很好加载到pictureBox1如果它不好也删除它也移动到下一个文件最后一个等等,直到它找到最后一个好的图像,然后将其加载到pictureBox1。

答案 1 :(得分:1)

我认为您正在寻找以下内容:如果最后一个文件不好,请继续查看,直至找到正确的文件。

while (true)
{
    int i = last_image_file(); // Get the last file in the folder if there are no files return -1
    if (i == -1) 
    {
        break; // Exit the loop
    }
    string Next_File = sf + @"\radar" + i.ToString("D6") + ".png";

    if (IsValidGDIPlusImage(Next_File))
    {
        pictureBox1.Load(Next_File);
        break; // Exit the loop
    }    
    else
    {
        File.Delete(Next_File);
    }
}

答案 2 :(得分:0)

您可以尝试从中创建一个Image,如果它抛出异常,那么它就会损坏。

public bool IsValidGDIPlusImage(string filename)
{
    try
    {
        using (var bmp = new Bitmap(filename))
        {
        }
        return true;
    }
    catch(Exception ex)
    {
        return false;
    }
}

这是针对byte []

public bool IsValidGDIPlusImage(byte[] imageData)
{
    try
    {
        using (var ms = new MemoryStream(imageData))
        {
            using (var bmp = new Bitmap(ms))
            {
            }
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

这两个答案均来自Read image and determine if its corrupt C#