You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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;
        }
    }
}

额外优化建议

  1. 复用FFMpegConverter实例
    不需要在循环中每次创建新的FFMpegConverter对象,循环外实例化一次即可,减少资源消耗:
var converter = new FFMpegConverter();
var id = 1;
foreach (var videoFile in videoFiles)
{
    converter.GetVideoThumbnail(videoFile, $"sample{id}.png");
    // 后续读取图片、添加列表的代码不变
    id++;
}
  1. 更准确的视频文件筛选
    用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);
  1. 清理临时图片文件
    如果不需要保留生成的临时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:45:34