• Viernes 14 de Marzo de 2025, 07:09

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - kezern

Páginas: [1] 2
1
Pascal / Ejercicios sobre punteros, listas, colas y pilas
« en: Martes 8 de Junio de 2010, 13:55 »
Hola a todos.
Estoy buscando ejemplos de ejercicios (a poder ser resueltos) sobre punteros, listas, colas y pilas. LLevo un rato buscando en google y lo único que encuentro son tutoriales sobre como usar punteros y los ejemplos que acompañan a los tutoriales son demasiado simples.
¿Alguien puede decirme donde conseguirlos?
Un saludo y gracias

2
Visual C++ / Re: Sockets Udp
« en: Jueves 30 de Noviembre de 2006, 12:30 »
Pues la verdad es que no había controlado eso. El servidor simplemente se iniciaba y comenzaba a enviar datos. Después el cliente los recoge. Me da igual si se pierden datos al prinicipio, mientras el cliente aún no está preparado para recibir.

3
Visual C++ / Re: Sockets Udp
« en: Jueves 30 de Noviembre de 2006, 12:00 »
No entiendo lo que dices de como se entera el servidor de quien tiene que recibir...
El servidor manda el dato a un único cliente que tiene una ip ya conocida.
Dices que has usado mi mismo código de inicialización. ¿Entonces que estoy haciendo mal?

4
Visual C++ / Re: Sockets Udp
« en: Jueves 30 de Noviembre de 2006, 09:58 »
Si que he mirado los ejemplos. No los estoy usando (ninguna de las tres fuciones). Si miras en el codigo verás que están comentados.

5
Visual C++ / Re: Sockets Udp
« en: Jueves 30 de Noviembre de 2006, 09:32 »
Nada, he puesto el bind tanto en el cliente como en el servidor y no funciona. Pego aquí debajo los dos programas completos. Lo que hace el servidor al ejecutar la función OnIniciar() es preparar el socket y pasar el apuntador al socket como parámetro a un thread. En ese thread comprimo la imagen y la mando. El cliente hace algo parecido. La función prepara el socket y lanza el thread pasándole como parametro el puntero al socket. Recoge la imagen y la muestra por pantalla. Pero el problema que tengo es que la pantalla de cliente sale negra. No se si porque no envia o porque no recibe. Intento pasarle el debug pero me dice que el breakpoint está puesto incorrectamente y lo desactiva.

El servidor es:
Código: Text
  1.  
  2. UINT WINAPI threaded(LPVOID param)
  3.  
  4. {
  5.   void **tmp = (void **) param;
  6.   SOCKET sock = (SOCKET) tmp[0];
  7.  
  8.   //Se conecta un cliente
  9.  
  10.   char buffers[80];
  11.   memset(buffers, 0, sizeof(buffers)); //Clear the buffer
  12.  
  13.   while (true)
  14.   {    
  15.       ///Creo un bucle para verificar que la función devuelve cierto.
  16.       while (!WriteRGBBytesIntoJpegFile(240,320,15,(unsigned char*) tmp[1])){}
  17.       //Almaceno la imagen y el tamaño en la estructura d
  18.       d=getJPG();
  19.       sprintf(buffers, "%8d", d->tam);
  20.       sendto(sock, buffers, sizeof(buffers) - 1,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);
  21.       sendto(sock, (const char*)d->buffer,d->tam,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);
  22.       proceso->SuspendThread();
  23.   }
  24.   ExitThread(0);
  25.   return 0;
  26.  
  27. }
  28.  
  29. void CARToolkitPPCDlg::OnIniciar()
  30. {
  31.   m_renderizar=true;
  32.   render->ShowWindow(true);
  33.   render->SetFocus();
  34.   GXResume();
  35.   render->SetForegroundWindow();    
  36.   int res=SHFullScreen(render->m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);    
  37.   //activamos el timer de renderizado
  38.   SetTimer(1,10,0);
  39.   SetTimer(2,400,0);
  40.  
  41.   ///Sockets a pelo
  42.   // Initiate the winsock2 library
  43.   WORD wVersionRequested;  
  44.   WSADATA wsaData;
  45.   wVersionRequested=MAKEWORD(2,2);
  46.   if (WSAStartup(wVersionRequested,&wsaData)!=0) {
  47.     printf("Initiating error");
  48.     exit(1);
  49.   }
  50.   //Definition of local and remote socket addresses
  51.   localSocketAddress.sin_family=AF_INET;
  52.   localSocketAddress.sin_port=htons((u_short)m_local_port);
  53.   localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY);
  54.   remoteSocketAddress.sin_family=AF_INET;
  55.   //remoteSocketAddress.sin_port=htons(7777);
  56.   remoteSocketAddress.sin_port=htons((u_short)m_remote_port);
  57.   // Here it's the remote machine ip address
  58.   int nSize = m_ip.GetLength();
  59.   char *pAnsiString = new char[nSize+1];
  60.   memset(pAnsiString,0,nSize+1);
  61.   wcstombs(pAnsiString, m_ip, nSize+1);
  62.   remoteSocketAddress.sin_addr.s_addr=inet_addr(pAnsiString);
  63.  
  64.   // TCP sockets  
  65.   sock=socket(PF_INET,SOCK_DGRAM,0);
  66.   if(sock==INVALID_SOCKET) {
  67.     printf("Creating socket error");
  68.     exit(1);
  69.   }
  70.   //Configuro los parámetros del socket
  71.   int val=5*1024*4;
  72.   int size=sizeof(int);
  73.   int flag=1;
  74.   setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char *) &val, sizeof(val));
  75.   setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (const char *) &val, sizeof(val));
  76.   setsockopt(sock,IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));
  77.  
  78.   int  check=bind(sock,(sockaddr*)&localSocketAddress,sizeof(localSocketAddress));
  79.  
  80.   /*unsigned long iostate = 1;
  81.   ioctlsocket(dialogSock,FIONBIO, &iostate); //non-blocking mode enabled
  82.  
  83.   int  check=bind(sock,(sockaddr*)&localSocketAddress,sizeof(localSocketAddress));
  84.   if(check==SOCKET_ERROR) {
  85.     printf("Bind error");
  86.     exit(1);
  87.   }
  88.   while (0!=listen(sock,0)){}
  89.   dialogSock=accept(sock,(struct sockaddr*)0, 0);
  90.   if(dialogSock==SOCKET_ERROR) {
  91.     printf("Accept error");
  92.     exit(1);
  93.   }*/
  94.   ///Fin de sockets a pelo*/
  95.   void **tmp = new void*[2];
  96.   tmp[0]=(void *)sock;
  97.   tmp[1]=app->getConvertedData();
  98.   proceso = AfxBeginThread(threaded,(void*)tmp,THREAD_PRIORITY_NORMAL,0,0,NULL);
  99. }
  100.  
  101.  
Y el cliente
Código: Text
  1.  
  2. UINT WINAPI threaded(LPVOID param)
  3.  
  4. {
  5.   void **tmp = (void **) param;
  6.   SOCKET socky = (SOCKET) tmp[0];
  7.   //Se conecta un cliente
  8.   bind (sock, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);
  9.   int length = sizeof remoteSocketAddress;
  10.   getsockname (sock, (struct sockaddr *) &remoteSocketAddress, &length);
  11.   char buffers[80];
  12.   memset(buffers, 0, sizeof(buffers)); //Clear the buffer
  13.   bool cycle=true;
  14.   int check, lon2;
  15.   while (cycle)
  16.   {
  17.     check=recvfrom (socky, buffers, sizeof(buffers)-1, 0, (struct sockaddr *)NULL, &lon2);
  18.     int num=atoi(buffers);
  19.     char* buf;
  20.     buf=new char [num];
  21.     check=recvfrom (socky,buf,num,0, (struct sockaddr *)NULL, &lon2);
  22.     mf.size=num;
  23.     mf.data=(unsigned char*)buf;
  24.     render.SetFocus();
  25.     app->renderFrame(mf);
  26.   }
  27.   ExitThread(0);
  28.   return 0;
  29.  
  30. }
  31.  
  32. void CARToolkitPPCDlg::OnIniciar()
  33. {
  34.   m_renderizar=true;
  35.   bool cycle = true;
  36.   render->ShowWindow(true);
  37.   render->SetFocus();
  38.   GXResume();
  39.   render->SetForegroundWindow();    
  40.   int res=SHFullScreen(render->m_hWnd, SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);    
  41.   int numUsers=0;
  42.   //conexión desde el servidor
  43. //  socketClient= new GeneralSocket(file);
  44.  
  45.   ///Conexión de los sockets a pelo
  46.   // Initiate the winsock2 library
  47.   WORD wVersionRequested;  
  48.   WSADATA wsaData;
  49.   wVersionRequested=MAKEWORD(2,2);
  50.   if (WSAStartup(wVersionRequested,&wsaData)!=0) {
  51.     printf("Initiating error");
  52.     exit(1);
  53.   }
  54.  
  55.   //Definition of local and remote socket addresses
  56.   localSocketAddress.sin_family=AF_INET;
  57.   localSocketAddress.sin_port=htons((u_short)m_local_port);
  58.   localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY);
  59.   remoteSocketAddress.sin_family=AF_INET;
  60.   remoteSocketAddress.sin_port=htons((u_short)m_remote_port);
  61.   // Here it's the remote machine ip address
  62.   int nSize = m_ip.GetLength();
  63.   char *pAnsiString = new char[nSize+1];
  64.   memset(pAnsiString,0,nSize+1);
  65.   wcstombs(pAnsiString, m_ip, nSize+1);
  66.   remoteSocketAddress.sin_addr.s_addr=inet_addr(pAnsiString);
  67.  
  68.   // TCP sockets, creo los dos sockets  
  69.   sock=socket(PF_INET,SOCK_DGRAM,0);
  70.   if(sock==INVALID_SOCKET) {
  71.     printf("Creating socket error");
  72.     exit(1);
  73.   }
  74.  
  75.   //Configuro cada uno de los sockets
  76.   int val=5*1024*4;
  77.   int size=sizeof(int);
  78.   int flag=1;
  79.   setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char *) &val, sizeof(val));
  80.   setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (const char *) &val, sizeof(val));
  81.   setsockopt(sock,IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));
  82.  
  83.   bind(sock, (struct sockaddr *) &remoteSocketAddress, sizeof(remoteSocketAddress));
  84.   //unsigned long iostate = 1;
  85.   //ioctlsocket(sock,FIONBIO, &iostate); /*non-blocking mode enabled*/
  86.  
  87.   //Conecto los dos sockets
  88.   //int  check=connect(sock, (struct sockaddr*) &remoteSocketAddress, sizeof remoteSocketAddress);
  89.   ///Fin de los sockets a pelo*/
  90.   void **tmp = new void*[2];
  91.   tmp[0]=(void *)sock;
  92.   tmp[1]=(void *)app;
  93.   proceso = AfxBeginThread(threaded,(void*)tmp,THREAD_PRIORITY_NORMAL,0,0,NULL);
  94.  
  95.  
  96.  
  97. }
  98.  
  99.  

6
Visual C++ / Re: Sockets Udp
« en: Miércoles 29 de Noviembre de 2006, 19:52 »
Muchas gracias por tu ayuda. Ahora estoy en casa. Mañana en el trabajo intentaré a ver si consigo algo.
La página de ejemplos que has puesto al parecer son en Unix, supongo que no hay diferencia entre Unix y windows no?
Un saludo.

7
Visual C++ / Re: Sockets Udp
« en: Miércoles 29 de Noviembre de 2006, 17:01 »
Creo que si que lo he cambiado bien. He añadido las estructuras en las que tengo las direcciones y los puertos. Me extraña que en caso del cliente sea NULL pero así lo encontré en el manual que he usado.
El send es así
Código: Text
  1.  
  2. send(sock, buffers, sizeof(buffers) - 1,0);
  3. send(sock, (const char*)d->buffer,d->tam,0);
  4.  
  5.  
Que lo he cambiado por
Código: Text
  1.  
  2. sendto(sock, buffers, sizeof(buffers) - 1,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);
  3. sendto(sock, (const char*)d->buffer,d->tam,0, (struct sockaddr *) &remoteSocketAddress, sizeof remoteSocketAddress);
  4.  
  5.  

Y en el caso del recv
Código: Text
  1.  
  2. check=recv (sock, buffers, sizeof(buffers)-1, 0);
  3. check=recv (sock,buf,num,0);
  4.  
  5.  
Y el recvfrom
Código: Text
  1.  
  2. recvfrom (socky, buffers, sizeof(buffers)-1, 0, (struct sockaddr *)NULL, &lon2);
  3. check=recvfrom (socky,buf,num,0, (struct sockaddr *)NULL, &lon2);
  4.  
  5.  
He añadido la estructuras de direcciones tal y como sale en un manual que tengo

8
Visual C++ / Sockets Udp
« en: Miércoles 29 de Noviembre de 2006, 16:41 »
Hola a todos. He hecho un programa servidor que envia una imagen a otro programa cliente usando sockets TCP. Me gustaría cambiarlo para que en lugar de TCP usase UDP. Lo he intentado pero no consigo que funcione.
El programa servidor es así.
Código: Text
  1.  
  2.   // Initiate the winsock2 library
  3.   WORD wVersionRequested;  
  4.   WSADATA wsaData;
  5.   wVersionRequested=MAKEWORD(2,2);
  6.   if (WSAStartup(wVersionRequested,&wsaData)!=0) {
  7.     printf("Initiating error");
  8.     exit(1);
  9.   }
  10.   //Definition of local and remote socket addresses
  11.   localSocketAddress.sin_family=AF_INET;
  12.   localSocketAddress.sin_port=htons(7777);
  13.   localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY);
  14.   remoteSocketAddress.sin_family=AF_INET;
  15.   remoteSocketAddress.sin_port=htons(7777);
  16.   remoteSocketAddress.sin_addr.s_addr=inet_addr("192.168.0.2");
  17.  
  18.   // TCP sockets  
  19.   sock=socket(PF_INET,SOCK_STREAM,0);
  20.   if(sock==INVALID_SOCKET) {
  21.     printf("Creating socket error");
  22.     exit(1);
  23.   }
  24.   //Configuro los parámetros del socket
  25.   int val=5*1024*4;
  26.   int size=sizeof(int);
  27.   int flag=1;
  28.   setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char *) &val, sizeof(val));
  29.   setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (const char *) &val, sizeof(val));
  30.   setsockopt(sock,IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));
  31.  
  32.   unsigned long iostate = 1;
  33.   ioctlsocket(dialogSock,FIONBIO, &iostate); //non-blocking mode enabled
  34.  
  35.   int  check=bind(sock,(sockaddr*)&localSocketAddress,sizeof(localSocketAddress));
  36.   if(check==SOCKET_ERROR) {
  37.     printf("Bind error");
  38.     exit(1);
  39.   }
  40.   while (0!=listen(sock,0)){}
  41.   dialogSock=accept(sock,(struct sockaddr*)0, 0);
  42.   if(dialogSock==SOCKET_ERROR) {
  43.     printf("Accept error");
  44.     exit(1);
  45.   }
  46.   char buffers[80];
  47.   memset(buffers, 0, sizeof(buffers)); //Clear the buffer
  48.         d=getJPG();
  49.         sprintf(buffers, "%8d", d->tam);
  50.   send(dialogSock, buffers, sizeof(buffers) - 1,0);
  51.   send(dialogSock, (const char*)d->buffer,d->tam,0);
  52.  
  53.  

Y el cliente así:
Código: Text
  1.  
  2. // Initiate the winsock2 library
  3.   WORD wVersionRequested;  
  4.   WSADATA wsaData;
  5.   wVersionRequested=MAKEWORD(2,2);
  6.   if (WSAStartup(wVersionRequested,&wsaData)!=0) {
  7.     printf("Initiating error");
  8.     exit(1);
  9.   }
  10.  
  11.   //Definition of local and remote socket addresses
  12.   localSocketAddress.sin_family=AF_INET;
  13.   localSocketAddress.sin_port=htons(7777);
  14.   localSocketAddress.sin_addr.s_addr=htonl(INADDR_ANY);
  15.   remoteSocketAddress.sin_family=AF_INET;
  16.   remoteSocketAddress.sin_port=htons(7777);
  17.   remoteSocketAddress.sin_addr.s_addr=inet_addr("192.168.0.3");
  18.  
  19.   // TCP sockets, creo los dos sockets  
  20.   sock=socket(PF_INET,SOCK_STREAM,0);
  21.   if(sock==INVALID_SOCKET) {
  22.     printf("Creating socket error");
  23.     exit(1);
  24.   }
  25.  
  26.   //Configuro cada uno de los sockets
  27.   int val=5*1024*4;
  28.   int size=sizeof(int);
  29.   int flag=1;
  30.   setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char *) &val, sizeof(val));
  31.   setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (const char *) &val, sizeof(val));
  32.   setsockopt(sock,IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));
  33.  
  34.   //Conecto los dos sockets
  35.   int  check=connect(sock, (struct sockaddr*) &remoteSocketAddress, sizeof remoteSocketAddress);
  36. check=recv (sock, buffers, sizeof(buffers)-1, 0);
  37.   int num=atoi(buffers);
  38.   char* buf;
  39.   buf=new char [num];
  40.   check=recv (sock,buf,num,0);
  41.   mf.size=num;
  42.   mf.data=(unsigned char*)buf;
  43.  
  44.  
Lo que he hecho ha sido cambiar el SOCK_STREAM por SOCK_DGRAM y eliminar en el servidor las funciones bind, listen y connect además de cambiar los send por sendto.
Pero no me funciona.
¿Alguien puede echarme una mano?

9
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Martes 14 de Noviembre de 2006, 17:06 »
He encontrado el problema. Tenía la función dentro de un timer porque quiero refrescar la imagen y lo que hacía en la segunda vuelta del timer era dibujarme la pantalla en negro.
Muchas gracias.

10
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Martes 14 de Noviembre de 2006, 16:15 »
He seguido mirando y he vuelto a hacer cambios. Ahora la función la tengo así:
Código: Text
  1.  
  2. DWORD CALLBACK CVOImage::GetImageDataBuffer(LPSTR szBuffer, DWORD dwBufferMax, LPARAM lParam )
  3. {
  4.         int size = min(mf.size - start, (int)dwBufferMax);
  5.   memcpy(szBuffer,mf.data + start,size);
  6.   start += size;
  7.         return size;
  8. }
  9.  
  10.  
De esta forma controlo que no se lean más bytes de los necesarios y también voy incrementando la dirección de memoria donde voy guardando los datos.
Ahora me muestra la imagen durante un instante y después se vuelve negro.

11
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Martes 14 de Noviembre de 2006, 15:32 »
He cambiado la función para que vaya incrementando la posición de memoria que lee y ahora la tengo así:
Código: Text
  1.  
  2. DWORD CALLBACK CVOImage::GetImageDataBuffer(LPSTR szBuffer, DWORD dwBufferMax, LPARAM lParam )
  3. {
  4.   memcpy(szBuffer + start,mf.data + start,dwBufferMax);
  5.   start = start + dwBufferMax;
  6.         return dwBufferMax;
  7. }
  8.  
  9.  
Al ejecutar el programa y pulsar en el botón para que ejecute la función, muestra una pantalla en blanco durante un instante y luego sale del programa (no debería salir del programa sino mostrar la imagen hasta que pulse yo en la pantalla).

12
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Martes 14 de Noviembre de 2006, 13:37 »
Ahora mismo lo que estoy haciendo es simular que trabajo con un buffer. Abro la imagen desde un archivo guardándola en un buffer y trabajo con ese buffer de memoria.
He declarado una variable global de tipo MemoryFile y la abro en la función Load
Código: Text
  1.  
  2. BOOL CVOImage::Load(HDC hdc, LPCTSTR pcszFileName)
  3. {
  4. .....
  5.          mf.load("Cliente/buffer.jpg");
  6.   // Fill in the 'DecompressImageInfo' structure
  7.   dii.dwSize = sizeof( DecompressImageInfo );    // Size of this structure
  8.   dii.pbBuffer = szBuffer;        // Pointer to the buffer to use for data
  9. ...
  10.  
  11.  
y después en la función que he creado GetImageDataBuffer
Código: Text
  1.  
  2. DWORD CALLBACK CVOImage::GetImageDataBuffer(LPSTR szBuffer, DWORD dwBufferMax, LPARAM lParam )
  3. {
  4.      memcpy(szBuffer,mf.data,mf.size);
  5.      return mf.size;
  6. }
  7.  
  8.  

13
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Martes 14 de Noviembre de 2006, 12:20 »
Lo siento Eternal Idol, estoy completamente perdido.
Me he creado una callback a la que he llamado GetImageDataBuffer para no modificar la original y también he cambiado dii.pfnGetData para que apunte a la nueva función.
En la nueva función intento abrir el buffer y rellenar szBuffer pero no me funciona.
No se que estoy pasando por alto.

14
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Viernes 10 de Noviembre de 2006, 13:10 »
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.

15
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Viernes 10 de Noviembre de 2006, 10:22 »
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.

16
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Jueves 9 de Noviembre de 2006, 18:11 »
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.

17
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Jueves 9 de Noviembre de 2006, 16:56 »
He buscado la función DecompressImageIndirect en los archivos del proyecto y sólo encuentro llamadas a ella o su definición en un archivo cpp, pero no veo su código por ningún sitio. ¿Estará entonces la función compilada dentro de la dll y yo no puedo modificarla? LLevo bastante tiempo buscando librerías que me permitan mostrar una imagen jpg en el display del pocket pc y sólo había encontrado esto.

18
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Jueves 9 de Noviembre de 2006, 16:22 »
Aquí adjunto el archivo VOImage.cpp
El código de la función en concreto es
Código: Text
  1.  
  2. BOOL CVOImage::Load(HDC hdc, LPCTSTR pcszFileName)
  3. {
  4.   if(m_hbitmap)
  5.   {
  6.   if(GetFileName().GetLength() && GetFileName() == pcszFileName)
  7.     return TRUE;  // Already Loaded
  8.  
  9.   DeleteObject(m_hbitmap);
  10.   }
  11.  
  12.   if(!m_hdc)
  13.   {
  14.   m_hdc = CreateCompatibleDC(hdc);
  15.  
  16.   HBITMAP  hbitmap = CreateCompatibleBitmap(hdc, GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES));
  17.  
  18.   SelectObject(m_hdc, hbitmap);
  19.   }
  20.  
  21.   BYTE    szBuffer[4096] = {0};
  22.   HANDLE hFile = INVALID_HANDLE_VALUE;
  23.  
  24. #ifdef _WIN32_WCE
  25.   HRESULT hr;
  26.  
  27.   DecompressImageInfo  dii;
  28. #endif
  29.  
  30.   hFile = CreateFile(pcszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
  31.   if (hFile == INVALID_HANDLE_VALUE)
  32.   return FALSE;
  33.  
  34. #ifdef _WIN32_WCE
  35.   // Fill in the 'DecompressImageInfo' structure
  36.   dii.dwSize = sizeof( DecompressImageInfo );  // Size of this structure
  37.   dii.pbBuffer = szBuffer;      // Pointer to the buffer to use for data
  38.   dii.dwBufferMax = 4096;        // Size of the buffer
  39.   dii.dwBufferCurrent = 0;      // The amount of data which is current in the buffer
  40.   dii.phBM = &m_hbitmap;        // Pointer to the bitmap returned (can be NULL)
  41.   dii.ppImageRender = NULL;      // Pointer to an IImageRender object (can be NULL)
  42.   dii.iBitDepth = GetDeviceCaps(hdc,BITSPIXEL);  // Bit depth of the output image
  43.   dii.lParam = ( LPARAM ) hFile;      // User parameter for callback functions
  44.   dii.hdc = m_hdc;        // HDC to use for retrieving palettes
  45.   dii.iScale = g_iScale;        // Scale factor (1 - 100)
  46.   dii.iMaxWidth = g_iMaxWidth;      // Maximum width of the output image
  47.   dii.iMaxHeight = g_iMaxHeight;      // Maxumum height of the output image
  48.   dii.pfnGetData = GetImageData;      // Callback function to get image data
  49.   dii.pfnImageProgress = ImageProgress;    // Callback function to notify caller of progress decoding the image
  50.   dii.crTransparentOverride = ( UINT ) -1;  // If this color is not (UINT)-1, it will override the
  51.               // transparent color in the image with this color. (GIF ONLY)
  52.  
  53.   // Process and decompress the image data
  54.   hr = DecompressImageIndirect( &dii );
  55. #endif
  56.  
  57.   // Clean up
  58.   CloseHandle( hFile );
  59.  
  60.   HBITMAP hbitmapOld = (HBITMAP)SelectObject(m_hdc, m_hbitmap);
  61.  
  62.   DeleteObject(hbitmapOld);
  63.  
  64.   BITMAP  bmp;
  65.  
  66.   GetObject(m_hbitmap, sizeof(BITMAP), &bmp);
  67.  
  68.   m_dwWidth = bmp.bmWidth;
  69.   m_dwHeight = bmp.bmHeight;
  70.  
  71.   m_strFileName = pcszFileName;
  72.   m_dwResourceID = 0;
  73.   m_hmoduleResource = 0;
  74.  
  75.   return TRUE;
  76. }
  77.  
  78.  
Ya me he fijado en la línea de la función CreateFile pero no se cómo cambiar para que la fuente sea el buffer de memoria
Gracias por vuestra ayuda

19
Visual C++ / Re: Voimage Imagen Desde Memoria
« en: Jueves 9 de Noviembre de 2006, 13:38 »
Si que tengo el fuente. VOImage.cpp y el .h
Ya he estado mirando a ver si otro método me permitía hacer lo que quiero (sería lógico que hubiese) pero no he encontrado nada.

20
Visual C++ / Voimage Imagen Desde Memoria
« en: Jueves 9 de Noviembre de 2006, 13:18 »
Hola a todos. Estoy usando VOImage para cargar imágenes jpg.
Tengo este código
Código: Text
  1.  
  2.    CVOImage ima;
  3.    CString path = _T("Cliente/img.jpg");
  4.    HDC picDC = ::GetDC(m_ventanaRender->m_hWnd);
  5.    ima.Load(picDC,path);
  6.    ima.Draw(picDC,0,0);
  7.    ReleaseDC( m_ventanaRender->m_hWnd, picDC);
  8.  
  9.  
En el leo la imagen desde un archivo y la muestro por pantalla.
Me gustaría modificar la función Load para leer el jpg desde un buffer de memoria, he cargado el archivo cpp e intentando comprender la función para modificar los parámetros pero no hay forma.
Alguien ha hecho algo parecido?
Agradecería una mano.
Un saludo.

21
Visual C++ / Librería Jpg
« en: Lunes 23 de Octubre de 2006, 12:31 »
Espero que la pregunta que voy a hacer no sea abusar mucho de vuestra paciencia.
Después de buscar mucho por Internet he conseguido convertir una imagen RAW a JPG. El problema es que dicha librería me guarda la imagen jpg en un archivo. Yo quiero tenerla en otro buffer para trabajar directamente con ella (al andar leyendo y escribiendo en archivos pierdo mucho tiempo). A esta función le paso entre otros parámetros pBuffer que es la imagen que quiero convertir y strOutFileName que es la ruta del archivo JPG de salida. He estado mirando el cinfo que parece que es donde guardan los parámetros de escritura del jpg para que me lo guardase en un buffer pero no lo he conseguido. ¿Alguien sabría como tengo que modificar el código para conseguir lo que pretendo?
Un saludo.


Código: Text
  1. BOOL WriteRGBBytesIntoJpegFile(const CString& strOutFileName, const int nWidth, const int nHeight, const int nQuality, BYTE* pBuffer)
  2. {
  3.   struct jpeg_compress_struct cinfo;
  4.   struct extended_error_mgr jerr;
  5.   JSAMPROW row_pointer[1];
  6.   int row_stride;
  7.  
  8.   FILE* outfile;
  9.   if ((outfile = _tfopen(strOutFileName, TEXT("wb"))) == NULL) {
  10.     strError.Format(CANT_OPEN_FILE, strOutFileName);
  11.     return FALSE;
  12.   }
  13.  
  14.   cinfo.err = jpeg_std_error(&jerr.pub);
  15.   jerr.pub.error_exit = extended_error_exit;
  16.   jerr.pub.output_message = extended_output_message;
  17.   jerr.pub.reset_error_mgr = extended_reset_error_mgr;
  18.  
  19.   if (setjmp(jerr.setjmp_buffer)) {
  20.     jpeg_destroy_compress(&cinfo);
  21.     fclose(outfile);
  22.     return FALSE;
  23.   }
  24.  
  25.   jpeg_create_compress(&cinfo);
  26.   jpeg_stdio_dest(&cinfo, outfile);
  27.  
  28.  
  29.  
  30.   cinfo.image_width = nWidth;  
  31.   cinfo.image_height = nHeight;
  32.   cinfo.input_components = 3;  
  33.   cinfo.in_color_space = JCS_RGB;  
  34.  
  35.   jpeg_set_defaults(&cinfo);
  36.   jpeg_set_quality(&cinfo, nQuality, TRUE);
  37.  
  38.   jpeg_start_compress(&cinfo, TRUE);
  39.  
  40.   row_stride = nWidth * 3;
  41.  
  42.   while (cinfo.next_scanline < cinfo.image_height) {
  43.     row_pointer[0] = & pBuffer[cinfo.next_scanline * row_stride];
  44.     jpeg_write_scanlines(&cinfo, row_pointer, 1);
  45.   }
  46.  
  47.   jpeg_finish_compress(&cinfo);
  48.   fclose(outfile);
  49.   jpeg_destroy_compress(&cinfo);
  50.  
  51.   return TRUE;
  52. }
  53.  

22
C/C++ / Re: Reducir El Peso De Una Imagen
« en: Lunes 18 de Septiembre de 2006, 19:37 »
Muchas gracias a todos por vuestras respuestas. He estado un poco ausente últimamente, mañana mismo pongo en prueba todos los consejos que me habéis dado.
Robokop, el enlace que has puesto ha caducado, serías tan amable de ponerlo de nuevo?
Un saludo y gracias de nuevo por todo.

23
Visual C++ / Re: Comprimir Imagen
« en: Lunes 18 de Septiembre de 2006, 19:34 »
Lo siento muchísimo. Justo después de poner ese mensaje dejé aparcado el trabajo y no he vuelto a tomarlo hasta hoy. No me había llegado ningún mensaje de respuesta así que tenía ese hilo perdido.
De nuevo reitero mis disculpas, en ningún momento he querido menospreciar la ayuda de nadie, sobre todo cuando usan su tiempo en beneficio de los demás.
Un saludo y muchas gracias

24
Visual C++ / Comprimir Imagen
« en: Lunes 18 de Septiembre de 2006, 16:53 »
Estoy haciendo un programa en EVC++ para un pocket pc y me gustaría alguna forma de comprimir una imágen que tengo. ahora mismo me ocupa 150 kb y la tengo en un buffer. Necesito que ocupe una cuarta parte de ese tamaño pero no consigo ni pasarla a escala de grises ni nada.
¿Hay alguna librería o cualquier otra forma de bajarle el tamaño a esa imagen?
Un saludo y gracias por adelantado.

25
C/C++ / Reducir El Peso De Una Imagen
« en: Miércoles 23 de Agosto de 2006, 11:18 »
Estoy haciendo un programa en Visual C++ para funcionar en un pocketpc. Por ahora conecto con la cámara del pocketpc y muestro el video en la pantalla. A la vez voy refrescando un buffer con los fotogramas que capturo de la cámara. Ahora intento mandar el contenido de ese buffer 30 veces por segundo a otro pocketpc para mostrar el video el el otro pocketpc. Se que la conexión por TCP se realiza bien porque he intentado mandar una sola vez el contenido del buffer y lo hace bien, pero cuando lo intento hacer de forma contínua el programa se bloquea. La imagen del buffer tiene una resolución de 320*240 y 2 bytes por píxel, lo que hace un tamaño de imagen de 150 kb. He hecho la prueba de mandar solo la mitad de la imágen y me lo hace bien, así que supongo que será un problema que la imágen es pesada para poder mandarla. Me gustaría saber alguna forma de reducirle el peso a unos 75Kb. No tengo muy claro como pasarla a escala de grises o si hay alguna compresión que pueda servirme.
Un saludo y gracias

Páginas: [1] 2