科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基于灰度颜色个数的视频截图选取2

基于灰度颜色个数的视频截图选取2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

   前几天在帮师兄做一个视频截图的模块,采用了DirectShow的接口来访问视频文件。开发工具使用的是Visual C 2005 Express 和Visual C

作者:中国IT实验室 来源:中国IT实验室 2007年10月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
  

其中,为了使用DirectShow,我们除了需要windows.h外,还需要dshow.h,qedit.h和atlbase.h三个头文件,最后再加上一个strmiids.lib库文件。
 
接下来就开启Visual C# 2005 Express来做一个简单的界面程序。为什么选择C# 来开发界面程序呢?原因很简单,因为C#很简单,同时Visual C# 2005 Express这样免费又功能强大的工具可以使用。
界面程序很简单,就下面这个样子:

 
       C# 部分调用前面写好的DLL函数,实现DDshow的抓图。 MovieGrabberDLL.cs源代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
 
namespace MovieGrabberCSharp
{
    
class MovieGrabberDLL
    
{
        [DllImport(
"MovieGrabberDLL.dll")]
        
public static extern int fnMovieGrabberDLL();
 
        [DllImport(
"MovieGrabberDLL.dll")]
        
public static extern IntPtr GrabMovieFrame(string aPath, int grayColorCountThreshold);
 
        
public static Bitmap GrabMovieFrameBitmap(string aPath,int grayColorCountThreshold)
        
{
            IntPtr hBitmap 
= GrabMovieFrame(aPath, grayColorCountThreshold);
            
if(hBitmap == IntPtr.Zero)
                
return null;
            
return Bitmap.FromHbitmap(hBitmap);
        }

 
        
public static Bitmap GrabMovieFrameBitmap(string aPath)
        
{
            
return GrabMovieFrameBitmap(aPath, 8);
        }

    }

}

 
窗口类MainForm.cs的源代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace MovieGrabberCSharp
{
    
public partial class MainForm : Form
    
{
        
public MainForm()
        
{
            InitializeComponent();
        }

 
        
private void OpenMovieFilePathButton_Click(object sender, EventArgs e)
        
{
            OpenFileDialog dlg 
= new OpenFileDialog();
            
if (dlg.ShowDialog() == DialogResult.OK)
            
{
                MovieFilePathTextBox.Text 
= dlg.FileName;
            }

 
        }

 
        
private void GrabberButton_Click(object sender, EventArgs e)
        
{
            Bitmap bitmap 
= MovieGrabberDLL.GrabMovieFrameBitmap(MovieFilePathTextBox.Text);
            
if (bitmap != null)
            
{
                MessageBox.Show(
"抓图成功!");
                GrabberPictureBox.SizeMode 
= PictureBoxSizeMode.StretchImage;
                GrabberPictureBox.Image 
= bitmap;
                GrabberPictureBox.Invalidate();
                GrabberPictureBox.Refresh();
            }

            
else
            
{
                MessageBox.Show(
"失败!");
            }

        }

 
        
private void ExitButton_Click(object sender, EventArgs e)
        
{
            
this.Close();
        }

    }

}

 
编译完成后,我们使用Windows里面的一个intro.wmv视频文件来做测试,具体路径是:C:\WINDOWS\system32\oobe\imagee\intro.wmv。之所以选择这个文件作为视频测试文件,因为这个视频是大家安装完成后WINXP后都会自动启动的Windows XP的介绍视频,而且这个视频的开始部分是全黑,然后渐渐变亮,再到Windows XP的动画部分。如果用Windows自带的浏览器看微缩图显示,就是下面这个结果:
       可以看到,这个intro.wmv的微缩图是完全的一张黑色图片,我们并不能看到任何关于视频文件有意义的内容。
       下面启动我们刚才编写的Demo视频截图工具来截一下图片,同样这个视频文件,可以看到这个的结果。
      
 
       其中,程序里面默认给出的灰度颜色个数阈值是8,那么就是说,至少图片要有8个不同的颜色灰度值才会截取,而之前的全黑,全白就自然滤过了。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章