我开发了一个应用程序,它使用c#.net框架4中的ImageList在listview中加载了许多图像。图像也被压缩。当许多图像被加载和压缩时,则需要很长时间。所以我在backgroundworker中调用该方法。在后台工作者中,我不得不将图像添加到ImageList并将ImageList添加到ListView。所以我使用了safeinvoke()方法listView1.SafeInvoke(d => d.Items.Add(item))。 一切正常。图像在列表视图中逐个显示。 但是应用程序的发布在某些电脑上无法正常工作,并且可以在其他电脑中正常使用。无法正常工作意味着,如果使用OpenFileDialog浏览100个图像进行加载,则会加载一些图像并将其添加到listview,然后加载会自动停止,而不会将所有图像添加到列表视图中,并且不会显示任何异常。
我花了很多次来解决这个问题,但无法弄清楚问题。 。问题出在哪儿?有人能帮助我吗?
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。
如何摆脱这个问题?
答案 0 :(得分:0)
我没有答案,但我有一些建议:
问题: