Extrait une image d'un film pour l'afficher dans une picturebox
astragoth66
Messages postés31Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention 2 octobre 2005
-
13 juin 2005 à 14:08
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
28 juin 2005 à 02:04
Bonjour,
Voila j'essaie
d'extraire une image d'un films pour ensuite faire du traitement
d'image dessus, mais j'aimerai afficher image par image dans ma
picturebox.
J'utilise C#
J'ai une classe qui s'appelle
AviReader, qui me permet d'ouvrir mon film et faire ce que je ve avec,
et voici mon code qui devrai normalement extraire l'image à la position
"position" (paramétre d'entre de lafonction) et cet fonction doit me
retourner un object de type Bitmap pour l'afficher dans ma picturebox.
public Bitmap ExtraitBmpAvi(int position)
{
if(position > countFrames)
{
throw new Exception("Invalid frame position");
}
//Decompress the frame and return a pointer to the DIB
int pDib =
Avi.AVIStreamGetFrame(getFrameObject, firstFrame + position);
//Copy the bitmap header into a managed struct
Avi.BITMAPINFOHEADER bih = new Avi.BITMAPINFOHEADER();
bih =
(Avi.BITMAPINFOHEADER)Marshal.PtrToStructure(new IntPtr(pDib),
bih.GetType());
/*if(bih.biBitCount < 24){
throw new Exception("Not enough colors! DIB color
depth is less than 24 bit.");
}else */
if(bih.biSizeImage < 1)
{
throw new Exception("Exception in AVIStreamGetFrame:
Not bitmap decompressed.");
astragoth66
Messages postés31Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention 2 octobre 2005 13 juin 2005 à 15:56
voila le programme ki ma servit de base pour faire le mien, celui ci
permet d'extraire une image d'un film, et de l'enregistrer sur le diske
dur directement...
et ca ca marche nikel
public void ExportBitmap(int position, String dstFileName){
if(position > countFrames){
throw new Exception("Invalid frame position");
}
//Decompress the frame and return a pointer to the DIB
int pDib =
Avi.AVIStreamGetFrame(getFrameObject, firstFrame + position);
//Copy the bitmap header into a managed struct
Avi.BITMAPINFOHEADER bih = new Avi.BITMAPINFOHEADER();
bih =
(Avi.BITMAPINFOHEADER)Marshal.PtrToStructure(new IntPtr(pDib),
bih.GetType());
/*if(bih.biBitCount < 24){
throw new Exception("Not enough colors! DIB color
depth is less than 24 bit.");
}else */
if(bih.biSizeImage < 1){
throw new Exception("Exception in AVIStreamGetFrame:
Not bitmap decompressed.");
}
//Copy the image
byte[] bitmapData = new byte[bih.biSizeImage];
int address = pDib + Marshal.SizeOf(bih);
for(int offset=0; offset //Create file header
Avi.BITMAPFILEHEADER bfh = new Avi.BITMAPFILEHEADER();
bfh.bfType = Avi.BMP_MAGIC_COOKIE;
bfh.bfSize =
(Int32)(55 + bih.biSizeImage); //size of file as written to disk
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 13 juin 2005 à 16:07
ok, je comprends mieux.
en fait, ce que tu fais toi, c'est que tu ne copies que les Datas de ton image dans le MemoryStream.
Malheureusement, ce que tu as oublié, c'est qu'une image contient aussi une entête.
il faut donc que tu écrives la même chose dans ton memoryStream.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 13 juin 2005 à 17:09
Salut, J'ai pas tout lu, c'est trop long... mais juste une question : Vous etes sur que la fonction Image.FromStream elle attend des donnees aux format GDI ? Elle attend peut etre juste le stream d'une image GDI+ !? Vu que j'ai pas tout lu je suis peut etre a cote de la plaque.. : )
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 13 juin 2005 à 18:27
Une image GDI+ c'est la classe Image de System.Drawing.. Peut etre que la fonction FromStream attend juste une classe System.Drawing.Image ou System.Drawing.Bitmap sous forme de stream.. ?? Meme si en interne elle utilise surement les fonctions GDI32.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 13 juin 2005 à 18:32
Sinon, un ptit detail.. tu devrais utiliser le code unsafe et les pointeurs, parce que "Marshal.ReadByte( new IntPtr( address ) );" pour du traitement video ca va pas le faire au niveau des performances !
sebmafate
Messages postés4936Date d'inscriptionlundi 17 février 2003StatutMembreDernière intervention14 février 201437 13 juin 2005 à 19:33
la méthode FromStream de la classe Bitmap accepte tout flux correctement construit et représentant une image (ex: .GIF, .PNG, .JPG...) donc, aucun rapport entre GDI et GDI+.
ton problème vient du fait que tu ne construis pas proprement ton flux dans ton memorystream.