Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

fallo con TStreams y Buffers

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: fallo con TStreams y Buffers Responder citando

Buenas a tod@s, les quiero felicitar por esta fabulosa herramienta y por dedicar parte de su tiempo a ayudar a los que menos saben Wink

Mi consulta, es sobre un error que me cierra el programa, sin haber hecho lo que yo quiero Sad

Bueno, la idea es que cargo un video (*.Mjpeg) con un FileOpen y leo los 5 primeros bytes para obtener la longitud de la primera imagen del video, luego vuelvo a leer esa longitud y lo meto en un TMemoryStream para intentar verla en un TImage.

El codigo: (soy novato)

int iFileHandle;
int iBytesRead;
int iFileLength;
int puntero;
char *pszBuffer;
char *pszJPG;
TMemoryStream *imagen;

try
{
//abro video
iFileHandle = FileOpen(Edit1->Text, fmOpenRead);
//obtengo su longitud
iFileLength = FileSeek(iFileHandle,0,2);
//lo posiciono al principio
FileSeek(iFileHandle,0,0);
//creo buffer longitud 5 bytes
pszBuffer = new char[5];
//leo los primeros 5 bytes del video(=tam primera imagen)
iBytesRead = FileRead(iFileHandle, pszBuffer, puntero);
//creo buffer para meter la imagen
pszJPG = new char [(int)pszBuffer];
//leo la imagen del video
iBytesRead = FileRead(iFileHandle, pszJPG, (int)pszBuffer);

FileClose(iFileHandle);

}catch(Exception *e) {ShowMessage("Problemas");}

//intento meterla en el MemoryStream y representarla
imagen->WriteBuffer(&pszJPG,iBytesRead);
Image1->Picture->Bitmap->LoadFromStream(imagen);

Seguro que tendré unos cuantos fallos, un saludo.

Punishero
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Ya está solucionado Responder citando

Bueno aunque parece que no haya causado mucho furor mi duda, explico la solución por si alguien en el futuro se encuentra con algo parecido.

El error estaba al leer la cabecera de la primera imagen JPEG que se encuentra en los 5 primeros bytes del archivo. Yo lo hacía así:

//leo los primeros 5 bytes del video(=tam primera imagen)
iBytesRead = FileRead(iFileHandle, pszBuffer, puntero);
//creo buffer para meter la imagen
pszJPG = new char [(int)pszBuffer];
//leo la imagen del video
iBytesRead = FileRead(iFileHandle, pszJPG, (int)pszBuffer);

pues al leer esos 5 bytes lo que debía hacer era:

IntToStr(pszBuffer[0])-> contiene el numero ASCII de las decenas de millar del tamaño de la imagen.
Si a IntToStr(pszBuffer[0]) restamos Integer('0') (codigo ASCII del cero) obtendremos el numero en decimal.

Si hacemos el mismo procedimiento con pszBuffer[1],..., pszBuffer[4] obtendremos el tamaño de la primera imagen:

int tam=(pszBuffer[0]-Integer('0'))*10000+(pszBuffer[1]-Integer('0'))*1000+(pszBuffer[2]-Integer('0'))*100+(pszBuffer[3]-Integer('0'))*10+pszBuffer[4]-Integer('0');

con:
pszJPG = new char[tam];
iBytesRead = FileRead(iFileHandle, pszJPG, tam);

tendremos la foto en el buffer pszJPG y podremos hacer con ella lo que queramos.

Un saludo, Punishero. Wink
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.