elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Obtenet imagenes de un video en un picturebox
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Obtenet imagenes de un video en un picturebox  (Leído 2,112 veces)
richardu1980

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Obtenet imagenes de un video en un picturebox
« en: 23 Noviembre 2022, 19:37 pm »

Hola quiero saber si es posible tomarle una foto al video y que se muestre en un Picture box, se utilizara otro picturebox para el tamaño y ubicacion dentro del video. GRACIAS!!!


En línea

Elektro Enjuto

Desconectado Desconectado

Mensajes: 121



Ver Perfil WWW
Re: Obtenet imagenes de un video en un picturebox
« Respuesta #1 en: 24 Noviembre 2022, 06:33 am »

Es posible extraer una porcion de una imagen de un video(*.mp4) en un PictureBox como si le tomasemos una foto pero capturando un area especifica del video con el Picturebox, asi tendriamos los valores de top y left y el tamaño basado en width y heigth.

GRACIAS!!!

Por la forma de expresarte me da la sensacion que no tienes una idea bien formada sobre algunos conceptos básicos de procesamiento de video. Yo tampoco es que sea un especialista en temas relacionados, pero puedo explicarte que aquello a lo que llamas "una imagen de un video" se conoce como fotograma o frame en Inglés, y la manera más sencilla para extraer fotogramas es utilizando alguna de las varias librerías especializadas para operar con archivos de video, como por ejemplo FFMediaToolkit que está basada en FFMPEG (y es la que yo estoy acostumbrado a utilizar para tareas relacionadas):

https://www.nuget.org/packages/FFMediaToolkit
https://github.com/radek-k/FFMediaToolkit

Para utilizar FFMediaToolkit necesitarás descargar también las librerías de FFMPEG. Léete el Readme.md del vínculo que he compartido al repositorio de GitHub donde hallarás una explicación más detallada.

A continuación te muestro un ejemplo para extraer el fotograma que coincida con una marca de tiempo específica de un archivo de video:

Código
  1. Imports System.Drawing.Imaging
  2. Imports System.Reflection
  3. Imports FFMediaToolkit
  4. Imports FFMediaToolkit.Decoding[code]
  5.  
  6. [code=vbnet]<DebuggerStepThrough>
  7. Public Function GetFrame(videoFilePath As String, timestamp As TimeSpan) As Bitmap
  8.  
  9.    Using file As MediaFile = MediaFile.Open(videoFilePath)
  10.  
  11.        Dim duration As TimeSpan = file.Video.Info.Duration
  12.        If duration < timestamp Then
  13.            Throw New ArgumentException("Video duration is smaller than the specified timestamp.", NameOf(timestamp))
  14.        End If
  15.  
  16.        Return ImageDataExtensions.ImageDataExtensions.ToBitmap(file.Video.GetFrame(timestamp))
  17.  
  18.    End Using
  19.  
  20. End Function

Por el momento no conozco una API (de varias que he llegado a examinar) que permita extraer un fotograma tomando como criterio el índice de fotograma en cuestión (quiero decir, que si un video tiene por ejemplo 1.000 fotogramas, indicarle que devuelva el fotograma número 500). Con esta API se puede llegar a hacer pero resultando en un procedimiento muy lento cuanto más grande sea el número del fotograma a extraer:

Código
  1. <DebuggerStepThrough>
  2. Public Function GetFrame(videoFilePath As String, frameNumber As Integer) As Bitmap
  3.  
  4.    Using file As MediaFile = MediaFile.Open(videoFilePath)
  5.  
  6.        Dim totalFrames As Integer = file.Video.Info.NumberOfFrames.Value
  7.        If totalFrames < frameNumber Then
  8.            Throw New ArgumentException("Total number of frames is smaller than the specified frame number.", NameOf(frameNumber))
  9.        End If
  10.  
  11.        For i As Integer = 0 To (frameNumber - 1)
  12.            Try
  13.                Using bmp As Bitmap = ImageDataExtensions.ImageDataExtensions.ToBitmap(file.Video.GetNextFrame())
  14.                End Using
  15.            Catch ex As Exception
  16.                Throw
  17.            End Try
  18.        Next
  19.  
  20.        Try
  21.            Return ImageDataExtensions.ToBitmap(file.Video.GetNextFrame())
  22.        Catch ex As Exception
  23.            Throw
  24.        End Try
  25.  
  26.    End Using
  27.  
  28. End Function


El código del método "ImageDataExtensions.ToBitmap":

Código
  1. // ***********************************************************************
  2. // Author   : ElektroStudios
  3. // Modified : 01-December-2020
  4. // ***********************************************************************
  5.  
  6. #region Imports
  7.  
  8. using System;
  9. using System.ComponentModel;
  10. using System.Diagnostics;
  11.  
  12. #endregion
  13.  
  14. #region ImageData Extensions
  15.  
  16. namespace DevCase.ThirdParty.FFMediaToolkit.Extensions.ImageDataExtensions {
  17.  
  18.    /// ----------------------------------------------------------------------------------------------------
  19.    /// <summary>
  20.    /// Contains custom extension methods to use with <see cref="global::FFMediaToolkit.Graphics.ImageData"/> type.
  21.    /// </summary>
  22.    /// ----------------------------------------------------------------------------------------------------
  23.    public static class ImageDataExtensions {
  24.  
  25.        #region  Public Extension Methods
  26.  
  27.        /// ----------------------------------------------------------------------------------------------------
  28.        /// <summary>
  29.        /// Converts the source <see cref="global::FFMediaToolkit.Graphics.ImageData"/> to <see cref="System.Drawing.Bitmap"/>.
  30.        /// </summary>
  31.        /// ----------------------------------------------------------------------------------------------------
  32.        /// <remarks>
  33.        /// Original source: <see href="https://github.com/radek-k/FFMediaToolkit#usage-details"/>
  34.        /// </remarks>
  35.        /// ----------------------------------------------------------------------------------------------------
  36.        /// <param name="imageData">
  37.        /// The source <see cref="global::FFMediaToolkit.Graphics.ImageData"/>.
  38.        /// </param>
  39.        /// ----------------------------------------------------------------------------------------------------
  40.        /// <returns>
  41.        /// The resulting <see cref="System.Drawing.Bitmap"/>
  42.        /// </returns>
  43.        /// ----------------------------------------------------------------------------------------------------
  44.        [DebuggerStepThrough]
  45.        [EditorBrowsable(EditorBrowsableState.Always)]
  46.        public static unsafe System.Drawing.Bitmap ToBitmap(this global::FFMediaToolkit.Graphics.ImageData imageData) {
  47.  
  48.            fixed (byte* data = imageData.Data) {
  49.                return new System.Drawing.Bitmap(imageData.ImageSize.Width, imageData.ImageSize.Height, imageData.Stride,
  50.                                                 System.Drawing.Imaging.PixelFormat.Format24bppRgb, new IntPtr(data));
  51.            }
  52.        }
  53.  
  54.        #endregion
  55.  
  56.    }
  57.  
  58. }
  59.  
  60. #endregion



asi tendriamos los valores de top y left y el tamaño basado en width y heigth.

No entiendo exactamente que quieres representar en el PictureBox, pero el tamaño del frame / video es el mismo tamaño del objeto Bitmap (Bitmap.Size) devuelto por la función "GetFrame".

Saludos.[/code][/code]


En línea

@%$& #$ %&#$, ¡hay que decirlo más!.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines