Programación General > Visual C++
Voimage Imagen Desde Memoria
kezern:
Pues usa la librería imgdecmp.dll, creo que si que pertenece al S.O. Así que la he hecho buena. Conoces tu alguna otra API (que esté ya portada o pueda portar yo) a PocketPC? Y si no pues... a seguir googleando.
Un saludo y gracias.
Eternal Idol:
--- Cita de: "kezern" --- Pues usa la librería imgdecmp.dll, creo que si que pertenece al S.O. Así que la he hecho buena. Conoces tu alguna otra API (que esté ya portada o pueda portar yo) a PocketPC? Y si no pues... a seguir googleando.
Un saludo y gracias.
--- Fin de la cita ---
Aca hay muy buena informacion:
http://www.unsupportedsoftware.com/products/dev/imgdecmp.htm
Ya entendi como funciona gracias a esa pagina, hay 2 funciones de tipo callback (te llaman desde la DLL) y tenes que reemplazar la de GetImageData. En vez de usar ReadFile lleva un puntero y devolve los datos de tu buffer :ph34r: B)
kezern:
Si he entendido bien esa función lo que hace es leer el archivo y devolver el número de bytes leidos? Como devuelvo la direccion de comienzo? Es decir, el puntero que me indica donde está la imagen? Estoy un poco liado.
Eternal Idol:
--- Cita de: "kezern" --- Si he entendido bien esa función lo que hace es leer el archivo y devolver el número de bytes leidos? Como devuelvo la direccion de comienzo? Es decir, el puntero que me indica donde está la imagen? Estoy un poco liado.
--- Fin de la cita ---
Lo que tenes que hacer es simular todo ese proceso de lectura del archivo. Guardar un puntero al buffer original y tener otro que vaya adelantando de acuerdo a los bytes que te pidan leer, obviamente este ultimo puntero tendra que recuperar el valor del buffer original cuando vuelvas a llamar a DecompressImageIndirect ... teniendo en cuenta como funciona esto podrias hacerlo incluso mas simple.
En lParam en vez de pasar un HANDLE al archivo, del cual ya tenes en memoria su contenido, pasas un doble puntero al comienzo del buffer. Entonces en GetImageData devolves los bytes requeridos y adelantas este doble puntero exactamente por esa cantidad de bytes.
Aca tenes un ejemplo tonto de programa, sin ningun tipo de comprobacion de limites:
--- Código: Text --- #include <windows.h>#include <stdio.h> static DWORD CALLBACK GetImageData( LPSTR szBuffer, DWORD dwBufferMax, LPARAM lParam ){ char **buff = (char**)lParam; memcpy(szBuffer, *buff, dwBufferMax); *buff += dwBufferMax; return dwBufferMax;} void main(){ HANDLE hFile = CreateFile("c:\\boot.ini", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); if (hFile != INVALID_HANDLE_VALUE) { DWORD DSize = GetFileSize(hFile, 0); char *buff = (char*)malloc(DSize + 1); char **pass = &buff; ZeroMemory(buff, DSize + 1); DWORD read = 0; ReadFile(hFile, buff, DSize, &read, 0); CloseHandle(hFile); for (int x = 0; x < 3; x++) { char raw[17]; ZeroMemory(raw, 17); GetImageData((LPSTR)&raw, 16, (LPARAM)pass); printf("%s\r\n", raw); } free(buff); }}
kezern:
La imagen que quiero mostrar la recibo a través de un socket desde otro pocket pc de forma que en mf.data tengo la imagen y en mf.size tengo el tamaño de esa imagen.
Por lo que veo en tu código lo que estás haciendo es crear un archivo y luego manejar un buffer. A mi lo que me gustaría seria evitar crear ese archivo. Lo que estoy recibiendo por el socket son fotogramas de un vídeo y tengo que ahorrar el máximo proceso posible.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa