Connaissez vous les movie barcode ?

(code barre de film en français)

 

Lost In Translation


J’adore les trucs inutiles mais fun, et ça en fait sans aucun doute partie :)

Il s’agit en fait d’obtenir une sorte d’empreinte d’un film, en mettant toutes ses images cotes à cotes, écrasées d’une façon qui ressemble à un code barre.

si vous en voulez plus, je vous conseil ce site, sur lequel j’ai découvert ces choses…

La première fois que j’en ai vu j’ai immédiatement pensé “j’aurais aimé être celui qui a eu l’idée de faire ça”, puis j’ai cherché rapidement si un code source permettant d’en créer existait déjà, et j’ai été surpris de ne rien trouver.

Alors j’ai voulu faire le mien :)

 

Première étape : comment extraire des images d’une vidéo

MovieBarCode Class View

Class View

 

Faire un truc pareil en .Net est loin d’être évident.

Je connaissais déjà la librairie BASS et son wrapper .Net pour le son, mais je n’avais jamais eu besoin de traiter de la vidéo.

Heureusement je ne suis pas le premier à chercher, et quelqu’un a écrit un wrapper .Net de fonctions DirectShow, et un article sur son utilisation.

Si j’ai bien compris, DirectX 8 est suffisant, ce code devrait donc marcher dans presque tous les cas.

Comme la classe de l’article ne me plaisait pas, j’ai réécrit un wrapper de wrapper en m’en inspirant, beaucoup plus simple d’utilisation et plus efficace (on ne recharge pas l’objet à chaque appel à une fonction) :

 

 

 

 

 

Cette classe s’initalise avec le chemin d’un fichier vidéo, et permet d’en extraire une image, soit pour la sauvegarder directement à l’emplacement indiqué, en bmp, soit pour en faire ce que l’on veut, avec l’instance de Bitmap renvoyée.

 

Deuxième étape : Génération du barcode

 

Une fois la première partie terminée, la génération du movie barcode en elle même est plutôt simple :

private Bitmap GenerateMovieBarCode(string videoPath)
{
    VideoHelper v = new VideoHelper(videoPath);
    Bitmap b = new Bitmap(1000, 500);
    System.Drawing.Graphics g = Graphics.FromImage(b);
    for (int i = 1; i <= 1000; i++)
    {
        Bitmap tempB = v.GetFrameFromVideo(((double)i) / 1000.0);
        g.DrawImage(tempB, i, 0, 1, 500);
    }
    v.Dispose();
    return b;
}

on prend 1000 images que l’on redimensionne à un pixel de large, et que l’on place à la suite dans une image de 1000×500.

 

Ce système basique rend des résultats très similaires à ceux du site précédent, et est plutôt rapide : pas plus de quelques minutes pour un film de 2h en .avi.

Si vous souhaitez expérimenter, en prenant une image par seconde par exemple, ne vous gênez pas, les sources sont la pour ça :)

 

MAJ :

Page de téléchargement (en Anglais uniquement pour l’instant)



Et en bonus, un rendu XXL du movie barcode de Lost In Translation :P