Newsgroup: it.comp.dotnet
Titolo: Prelevare il colore di un pixel da un filmato

Ciao a tutti.
Ho un problema forse già affrontato ma di cui non riesco a trovare
documentazione.
Ho la necessità di prevelare il colore di un pixel o di una piccola porzione
di pixel per misurarne il colore medio in una determinata porzione di un
filmato.
Il problema è che utilizzando la api getpixel o lavorando con la getpixel di
Bitmap non viene rilevato il colore del pixel.
In realtà è il mio primo approccio nel campo dei video e non ho le
conoscenze adeguate.
Comunque :
sto provando con questa funzione, devo dire non velocissima :
 
Public Function GetColorPixel(ByVal x As Integer, ByVal y As Integer) As
Integer
        Dim winDc As Integer = GetWindowDC(GetDesktopWindow)
        Dim color As Integer = GetPixel(winDc, x, y) '.ToString
        Return color
End Function
 
molto più veloce questa :
   Function GetScreenPixel(ByVal pt As Point) As Color
        Using bmp As New Bitmap(1, 1)
            Using g As Graphics = Graphics.FromImage(bmp)
                g.CopyFromScreen(pt, Point.Empty, New Size(1, 1))
                Return bmp.GetPixel(0, 0)
            End Using
        End Using
    End Function
 
ma entrambe ritornano il colore black su filmati.
 
Il problema è che l'operazione deve essere velocissima in quanto devo
sontestualmente modificare il colore, con una frequenza di qualche centesimo
di secondo.
Forse la strada è nell'utilizzo delle directx?
 
Qualcuno mi saprebbe aiutare?
Grazie mille.
 
 
 

 Bitmap non viene rilevato il colore del pixel.
 
Non puoi usare le classi GDI/GDI+ per un video.
Puoi usare DirectShow oppure Windows Media Foundation (da Vista in 
poi).
Entrambi lavorano a pipeline dove il flusso parte dalla sorgente del 
segnale (lettura file), passa da uno o più encoder e arriva infine 
tipicamente alla scheda audio che riproduce il suono.
 
Diciamo che vuoi lavorare con DirectShow, in questo caso dovrai 
sviluppare un filter che si mette in mezzo nella pipeline e intercetta 
tutti i frame. Quello è il punto nel quale hai a disposizione la 
singola immagine da cui poter ricavare le informazioni che ti servono.
 
Se cerchi 'directshow filter C#' troverai diverso materiale in giro...
 
-- 
Raffaele Rialdi  
http://www.iamraf.net
 
Weblog: 
http://blogs.ugidotnet.org/raffaele
 
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
 
UGIdotNET - 
http://www.ugidotnet.org/
 
 
 

      End Function
 
Ciao,
io ho provato questo esempio e, per un filmato riprodotto con wmp, 
funziona. E' pari al tuo esempio:
 
http://www.youtube.com/watch?v=oyME_Pa_o8k
 

Grazie mille!
Nell'attesa stavo tentando di capire con Diretshow e devo dire che è davvero
un mondo interessante.
A riguardo del graphBuilder magari se posso ti chiederò qualche dritta se
incontro problemi (direi certamente)!
Ciao!
 
 

Si, vero. Ma in genere i player dvbt utilizzano directx dove l'esempio non 
può funzionare.
Sto vedendo con directshow che è credo la strada migliore con la speranza
che tutto si possa fare con la velocità richiesta.
Ciao e grazie. 
 
 

 ha scritto nel messaggio 
news:mn.2d617dbb1...@n0spamvevy.com...



 
Da quanto racconti hai costruito un grado di filtri già installati. 
Questo è certamente il primo passo.
Adesso dovresti creare un tuo nuovo filter che si piazzi prima del 
renderer in cui intercetti il flusso (solo video) dei frame.
 
Prima di tutto leggiti un po' di doc qui:
http://msdn.microsoft.com/en-us/library/ms788163
 
 
Poi in giro trovi già molti esempi sia C++ che C# su come creare quel 
tipo di filtro.
Dovrai fare un po' di prove ma la cosa positiva è che, una volta 
registrato, potrai testarlo direttamente inserendolo visualmente nel 
grafo che hai già creato.


Si, con questi filtri creo il player : mi connetto al canale digitale e lo 
mando in esecuzione.
Mi rinfranca la tua risposta anche se da qui a vedere il lavoro finito ho da 
capire quale filtro devo sistemare e soprattutto come intercettare 
l'immagine.
Grazie. 
 
 


Butta un occhio su questo:
http://www.codeproject.com/KB/audio-video/framegrabber.aspx
 
 
altra possibile soluzione:
http://msdn.microsoft.com/en-us/library/ms787697
 
 
Libreria che semplifica tutto:
http://splicer.codeplex.com/
 
 
Altra libreria (forse la più famosa):
http://directshownet.sourceforge.net/about.html
 
 
La corrispondente per Media Foundation:
http://mfnet.sourceforge.net/
 


Grazie per l'aiuto prezioso.
Ciao! 
 
 

 Ciao!
 
Prego!
