Capture Webcam et transfert via CGI

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Fels
Messages : 12
Inscription : ven. 04/mai/2018 21:04

Capture Webcam et transfert via CGI

Message par Fels »

Bonjour à tous,

Je souhaite transférer d'une page web (html) une capture photo à l'aide ma webcam et l'enregistrer dans une base de donnée SQLite ou sur Disque.
J'encode (grâce à google) la capture en Base64, mais de l'autre coté, au niveau du CGI c'est une vrai galère pour moi.
Merci d'avance pour votre aide,

Ci dessous la page html :

Code : Tout sélectionner

<!DOCTYPE html> 
<html lang="en">
<head>
    <title>HTML5 Camera</title> 
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, user-scalable=yes">

	<script type="text/javascript">
	
	var mediaStream
	
	function init() {

		navigator.mediaDevices.getUserMedia({ audio: false, video: { width: 800, height: 600 } }).then(function(mediaStream) {
			
			var video = document.getElementById('sourcevid');
			video.srcObject = mediaStream;
			
			video.onloadedmetadata = function(e) {
				video.play();
			};
		  
		}).catch(function(err) { console.log(err.name + ": " + err.message); });
	
	}

	function clone(){
		var vivi = document.getElementById('sourcevid');
		var canvas1 = document.getElementById('cvs').getContext('2d');
		canvas1.drawImage(vivi, 0,0, 150, 112);
		var base64 = document.getElementById('cvs').toDataURL("image/png");	//l'image au format base 64
		document.getElementById('tar').value = '';
		document.getElementById('tar').value = base64;
	}

	function stop() {
		var video = document.getElementById('sourcevid');
		video.srcObject = mediaStream;
		
		video.onloadedmetadata = function(e) {				
			this.getVideoTracks().forEach(function(track) {
				track.stop();
				});
			};	
	}

	window.onload = init;
	
	</script>
	
</head>

<body>
    
        <video id="sourcevid" height='150' width='150' autoplay="true"  style='display:inline'></video>
		
		<div id="main" style='height:150px;width:150px;margin:auto;display:inline'>
		
        <canvas id="cvs" height='150' width='150'></canvas>
		
		</div>
		
		<button onclick='clone()' style='height:50px;width:80px;margin:auto'>photo</button>
		<button onclick='stop()' style='height:50px;width:80px;margin:auto'>stop</button>		
				
		<form action="../cgi-bin/capture.exe" method="Post">
			<textarea id='tar' name="tar" style='width:50%;height:200px;'></textarea>
			<button type="submit" style='height:50px;width:80px;margin:auto'>Envoyer</button>
		</form>
</body>
</html>
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Capture Webcam et transfert via CGI

Message par Ar-S »

Bonjour.
Tu aurais un code en purebasic sinon ?
Si ton fichier est en base64, c'est une chaine. il te suffit d'utiliser le combo CreateFile / WriteString / CloseFile

pour le sauver en local.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Fels
Messages : 12
Inscription : ven. 04/mai/2018 21:04

Re: Capture Webcam et transfert via CGI

Message par Fels »

Voila ici il y ' a une procedure que j'ai prise du forum russe (le fichier est créé mais impossible de l'ouvrir), merci :

Code : Tout sélectionner



UsePNGImageEncoder()

Procedure GetImageFromBase64(dataBase64$)
     *Decoded = AllocateMemory(StringByteLength(dataBase64$)) 
     ;Debug Base64Decoder(@dataBase64$, tringByteLength(dataBase64$), *Decoded, StringByteLength(dataBase64$))
     If CreateFile(0, "e:\Zimage.png")
          For k = 0 To StringByteLength(dataBase64$)
               WriteByte(0, k)
          Next
          CloseFile(0)
     Else
          MessageRequester("PureBasic", "Error: can't write the file", 0)
          End
     EndIf
   EndProcedure
   
   
If Not InitCGI() Or Not ReadCGI()
    End
EndIf
  
Global glImageMemory.l
  
  
WriteCGIHeader(#PB_CGI_HeaderContentType, "text/html", #PB_CGI_LastHeader) ; Ecrit les en-têtes pour informer le navigateur du format du contenu


WriteCGIString("<html><title>PureBasic - parametres</title><body>" +
                 "NbParametres: " + CountCGIParameters() + "<br><br>")
  
image64$ = CGIParameterValue("tar")


GetImageFromBase64(image64$) 
  
 WriteCGIString("</body></html>")

Fels
Messages : 12
Inscription : ven. 04/mai/2018 21:04

Re: Capture Webcam et transfert via CGI [Résolu]

Message par Fels »

J'ai enfin réussi, le code n'est pas très optimisé mais ça marche (j'ai pris ce code sur le forum russe et je l'ai modifié car il ne fonctionnait pas), et la page html est dans le premier post :

Code : Tout sélectionner

If Not InitCGI() Or Not ReadCGI()
  End
EndIf


UsePNGImageEncoder()

Procedure GetImageFromBase64(dataBase64$, nom$) 

  Define image.s = dataBase64$
  Define Dim InputBuffer.b(0)
  Define Dim OutputBuffer.b(0)
  Dim InputBuffer(Len(image))
  Dim OutputBuffer(Len(image)) ; реально будет меньше
  Define InputBufferLen = PokeS( InputBuffer(), image, -1, #PB_Ascii)
  Define OutputBufferLen = Base64Decoder( image, OutputBuffer(), ArraySize(OutputBuffer()))
  
  If CreateFile(0,"E:\" + nom$ + "_" + Str(Date()) + ".png")  
        WriteData(0,OutputBuffer(),OutputBufferLen )
        CloseFile(0)                        
  EndIf
          
EndProcedure


WriteCGIHeader(#PB_CGI_HeaderContentType,"text/html",#PB_CGI_LastHeader)

image$ = CGIParameterValue("tar")
nom$ = CGIParameterValue("nom")


Resultat = FindString(image$, ",") 
chaineToDel$ = StringField(image$, 1, ",")
Resultat$ = RemoveString(image$, chaineToDel$ + "," , 0,0,1 )

GetImageFromBase64(Resultat$, nom$)
Répondre