Приложение c # не работает должным образом на некоторых ПК - PullRequest
0 голосов
/ 26 февраля 2012

Я разработал приложение, которое загружало много изображений в виде списка с помощью ImageList в c # .net framework 4. Изображения также сжимаются. Когда загружается и сжимается много изображений, это занимает много времени. Поэтому я называю метод в фоновом режиме. В фоновом режиме мне пришлось добавить изображения в ImageList и добавить ImageList в ListView. Поэтому я использовал метод listin1.SafeInvoke safeinvoke () (d => d.Items.Add (item)). Все отлично работает Изображения отображаются один за другим в списке. Но выпуск приложения не работает должным образом на некоторых компьютерах и работает должным образом на других компьютерах. Не работает должным образом, значит, если 100 изображений просматриваются с использованием OpenFileDialog для загрузки, некоторые изображения загружаются и добавляются в просмотр списка, а затем загрузка автоматически останавливается без добавления всех изображений в просмотр списка, и исключение не отображается.

Я потратил много раз, чтобы решить эту проблему, но не мог понять проблему. , В чем проблема? Кто-нибудь может мне помочь?

 private void bgwLoading_DoWork(object sender, DoWorkEventArgs e)
         {

            ArrayList a = (ArrayList)e.Argument;

            string[] fileNames = (string[])a[0];

            this.loadMultiImages(fileNames);

        }

 private void loadMultiImages(string[] fileNames)        
  {
             int i = 1;
             int totalFiles = fileNames.Count();

                foreach (string flName in fileNames)
                {
                  if (!flName.Contains("Thumbs.db"))
                    {
                        Bitmap newBtmap = (Bitmap)Image.FromFile(flName);

                        FileInfo fi = new FileInfo(flName);
                        long l = fi.Length;

                        if (l > compressSize)
                        {
                                newBtmap = resizeImage(newBtmap, 1024,768) ;
                                newBtmap = saveJpeg(IMAGE_PATH + (SCANNING_NUMBER +  
                                ) + ".jpg", newBtmap, IMAGE_QUALITY);
                        }
                        else
                        {
                            File.Copy(flName, TEMP_IMAGE_PATH + (SCANNING_NUMBER + 1) + ".jpg");

                        }



                        if (!bgwLoading.CancellationPending)
                        {
                            CommonInformation.SCANNING_NUMBER++;
                            this.SafeInvoke(d => d.addItemToLvImageContainer(newBtmap));
                            bgwLoading.ReportProgress((int)Math.Round((double)i / (double) 
                            (totalFiles) * 100));

                            i++;
                           }                        
                   }
                }
             }

        }

        public void addItemToLvImageContainer(Bitmap newBtmap)
          {
              imageList.Images.Add(newBtmap);
             ListViewItem item;
             item = new ListViewItem();
             item.ImageIndex = SCANNING_NUMBER - 1;
             item.Text = SCANNING_NUMBER.ToString();
             lvImageContainer.Items.Add(item);
             lvImageContainer.Items[item.ImageIndex].Focused = true;

          }

Чтобы выяснить ошибку, я изменил код следующим образом:

Я прокомментировал две строки

          //newBtmap = resizeImage(newBtmap, 1024, 768);

         // newBtmap = saveJpeg(IMAGE_PATH + scanning_number + ".jpg", newBtmap, Image_Quality );

и добавили try-catch следующим образом:

                   try
                       {
                            Bitmap newBtmap = (Bitmap)Image.FromFile(flName);

                              File.Copy(flName, CommonInformation.TEMP_IMAGE_PATH + 
                              (CommonInformation.SCANNING_NUMBER + 1) + ".jpg");


                                 if (!bgwLoading.CancellationPending)
                                  {
                                    this.SafeInvoke(d => d.imageList.Images.Add(newBtmap));


                                    ListViewItem item;
                                    item = new ListViewItem();

                                    CommonInformation.SCANNING_NUMBER++;

                                    item.ImageIndex = CommonInformation.SCANNING_NUMBER - 1;
                                    item.Text = CommonInformation.SCANNING_NUMBER.ToString();
                                    this.SafeInvoke(d => d.lvImageContainer.Items.Add(item));

                                    bgwLoading.ReportProgress((int)Math.Round((double)i / 
                                   (double)(totalFiles) * 100));

                                     this.safeInvoke(d=>d.addItemImageContainer(newBtmap)) 

                               catch (Exception ex)
                               {
                                     MessageBox.Show( ex.Message);

                                 }

Показывает сообщение об ошибке после загрузки некоторых изображений как «OutOfMemoryException»

Скорее всего, следующая строка создает исключение:

Растровое изображение newBtmap = (Растровое изображение) Image.FromFile (flName);

Но файлы изображений не повреждены и имеют расширение .JPG.

Как избавиться от этой проблемы?

1 Ответ

0 голосов
/ 26 февраля 2012

У меня нет ответа, но у меня есть несколько предложений:

  1. Проверка версии .NET framework на компьютерах с проблемами
  2. Проверьте, есть ли у вас права доступа к файлам, которые вы пытаетесь прочитать
  3. Используйте "try-catch" при доступе к файлам

И вопросы:

  1. Написан ли этот проект в более старой версии .NET и перенесен / обновлен до .NET 4.0?
  2. Используете ли вы какие-либо встроенные сборки или внешние библиотеки DLL для обработки изображений?
...