Я разработал приложение, которое загружало много изображений в виде списка с помощью 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.
Как избавиться от этой проблемы?