如何修复3×3 PictureBox网格重复显示视频缩略图的问题
解决3×3 PictureBox网格显示对应视频缩略图的问题
你的问题出在最后给PictureBox赋值的循环逻辑上:
foreach(var image in thumbNails) { for(int i = 0; i < 3; i++) { for(int j=0; j< 3; j++) { pictureBoxes[i, j].Image = image; } } }
这段代码会把每一张缩略图依次赋值给所有9个PictureBox,循环结束后,所有控件自然都显示最后一张缩略图。
修改后的赋值逻辑
我们需要把thumbNails列表中的图片和pictureBoxes二维数组的元素按顺序一一对应赋值,用一个索引变量追踪当前要赋值的图片即可:
int imageIndex = 0; for(int i = 0; i < 3; i++) { for(int j=0; j< 3; j++) { // 处理视频文件不足9个的情况,避免索引越界 if(imageIndex < thumbNails.Count) { pictureBoxes[i, j].Image = thumbNails[imageIndex]; imageIndex++; } else { // 没有足够缩略图时,可设置默认图或清空 pictureBoxes[i, j].Image = null; } } }
额外优化建议
- 复用FFMpegConverter实例
不需要在循环中每次创建新的FFMpegConverter对象,循环外实例化一次即可,减少资源消耗:
var converter = new FFMpegConverter(); var id = 1; foreach (var videoFile in videoFiles) { converter.GetVideoThumbnail(videoFile, $"sample{id}.png"); // 后续读取图片、添加列表的代码不变 id++; }
- 更准确的视频文件筛选
用Path.GetExtension判断扩展名,避免文件名中包含.mp4/.avi的非视频文件被误选:
var videoExtensions = new HashSet<string> { ".mp4", ".avi" }; var videoFiles = Directory.GetFiles(location) .Where(x => videoExtensions.Contains(Path.GetExtension(x).ToLower())) .Take(9);
- 清理临时图片文件
如果不需要保留生成的临时PNG文件,可以在添加图片到列表后删除(注意先创建Image副本,避免文件被占用):
var tempPath = $"sample{id}.png"; converter.GetVideoThumbnail(videoFile, tempPath); // 创建副本,解除文件锁定 using(var tempBitmap = Image.FromFile(tempPath)) { var bitmap = new Bitmap(tempBitmap); thumbNails.Add(bitmap); } // 删除临时文件 File.Delete(tempPath);
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

