Programación Wii - Mostrar imagen JPG
Este artículo está en construcción.
Por esta razón, seguramente habrá lagunas en el contenido o en el formato. Por favor, antes de cambiar el contenido, consulta la página de discusión del artículo.
Este artículo tiene información extraída de una web que no trabaja con Creative Commons.
No se pueden añadir contenidos no CC al wiki de ElOtroLado, podríamos tener problemas legales. Considera la posibilidad de buscar fuentes similares bajo CC, y en última instancia, pedir el borrado del artículo.
Contenido |
Descripción
El código siguiente muestra una imagen jpg en pantalla haciendo uso de las librerías libJPEG. Éstas librerías han sido portadas a wii por dsbomb.
Código
//LIBRERIAS//////////////////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h> #include <gccore.h> #include <ogcsys.h> #include <string.h> #include <jpeg/jpgogc.h> //Para manejar imágenes jpg //---External Picture---// extern char picdata[]; extern int piclength; //DATOS GLOBALES/////////////////////////////////////////////////////////////////////////////////// GXRModeObj *modovideo; //Objeto para cargar los datos del modo de vídeo u32 *framebuffer[2] = { NULL, NULL }; // Creamos dos Framebuffers int cualfb = 0; // Lo utilizaremos para seleccionar el framebuffer
//------------------------------------------------------------------------------------------------- // Inicializa() // // Esta función se encargará de configurar el modo de vídeo y ... // output. //------------------------------------------------------------------------------------------------- static void Inicializa(void) { VIDEO_Init(); //Es IMPORTANTE que seal lo primero que hagamos en cualquier proyecto //Además de inicializar el subsistema de vídeo configura el sistema del ogc PAD_Init(); //Inicializa los padas para recibir datos //Establecemos para para el modo de vídeo de la consola la mayor resolución entrelazada switch (VIDEO_GetCurrentTvMode()) { case VI_NTSC: modovideo = &TVNtsc480IntDf; break; case VI_PAL: modovideo = &TVPal528IntDf; //Para el área PAL usaremos 640x528 break; case VI_MPAL: modovideo = &TVMpal480IntDf; break; default: modovideo = &TVNtsc480IntDf; break; } VIDEO_Configure(modovideo); //Permitimos que libogc configure el modo que hayamos establecido //Configuramos las pantallas virtuales (framebuffers). Las pantallas virtuales son trozos de //memoria que almacenan la "ristra" de píxels que se dibujarán en la pantalla real............ framebuffer[0] = (u32 *) MEM_K0_TO_K1(SYS_AllocateFramebuffer(modovideo)); //Reservamos memoria framebuffer[1] = (u32 *) MEM_K0_TO_K1(SYS_AllocateFramebuffer(modovideo)); //No lo usaremos //Definimos una consola........................................................................ console_init(framebuffer[0], 20, 64, modovideo->fbWidth, modovideo->fbHeight, modovideo->fbWidth * 2); //Limpiamos las pantallas virtuales............................................................ VIDEO_ClearFrameBuffer(modovideo, framebuffer[0], COLOR_BLACK); //Limpiamos el framebuffer poniendo color VIDEO_ClearFrameBuffer(modovideo, framebuffer[1], COLOR_BLACK); //negro todos lo píxels VIDEO_SetNextFramebuffer(framebuffer[0]); //Preparamos el framebuffer para que sea dibujado durante la //próxima actualización de la pantalla //Hacemos que libogc actualice la información de los PADs...................................... VIDEO_SetPostRetraceCallback(PAD_ScanPads); VIDEO_SetBlack(0); //Actualizamos el vídeo........................................................................ VIDEO_Flush(); VIDEO_WaitVSync(); //Esperamos al retrazo vertical if (modovideo->viTVMode & VI_NON_INTERLACE) VIDEO_WaitVSync(); }
//------------------------------------------------------------------------------------------------- // MAIN //------------------------------------------------------------------------------------------------- int main() { //VARIALBES.................................................................................... JPEGIMG jpeg; //Los datos de la imagen jpg int fila, //Nos indicará en qué fila de píxels nos encontramos columna, //Ídem columna pixeldoble,//Píxel activo (IMPORTANTE: los píxels se cargarán de dos en dos) offset; //Posición dentro del framebuffer o de la imagen unsigned int *jpegout; //Puntero con el que accederemos a nuestra imagen //Inicializaciones............................................................................. memset(&jpeg, 0, sizeof(JPEGIMG)); //Rellenamos la variable jpeg con el valor cero Inicializa(); //LLAMADA A LA FUNCIÓN QUE CREAMOS previamente encargada de las inicializaciones //INICIO....................................................................................... printf("Tutorial segundo: La librería libjpeg\n"); // jpeg.inbuffer = picdata; jpeg.inbufferlength = piclength; JPEG_Decompress(&jpeg);//Llamada al decompresor printf("Pulsa A para mostrar la imagen\n"); while (!(PAD_ButtonsDown(0) & PAD_BUTTON_A)); //Este bucle no parará hasta que se pulse A while (PAD_ButtonsDown(0) & PAD_BUTTON_A); cualfb ^= 1; // pixeldoble = 0; // Inicializamos a cero para situarnos al comienzo jpegout = (unsigned int *) jpeg.outbuffer; offset = 0; // Inicializamos a cero para situarnos al comienzo del array de píxels //Recorremos píxel a píxel la imagen cargando el valor de éstos (los colores) a la pantalla //virtual (que simplemente es una sucesión de valores de colores) for (fila = 0; fila < jpeg.height; fila++) { //Repetimos tantas veces como filas haya for (columna = 0; columna < (jpeg.width >> 1); columna++) //Recorremos la fila horizontalmente //Sólo recorreremos la mitad del ancho (ancho >> 1) //puesto que cada vez que cargamos la varible lo //hacemos con un valor que nos permite conocer //el color de dos píxels contiguos framebuffer[cualfb][offset + columna] = jpegout[pixeldoble++]; //Guardamos el valor en el framebuffer offset += jpeg.width >> 1; //Movemos el offset para que se situe en lo que sería la siguiente línea } //Es IMPORTANTE liberar la memoria free(jpeg.outbuffer); //Finalmente mostramos la imagen VIDEO_SetNextFramebuffer(framebuffer[cualfb]); VIDEO_Flush(); VIDEO_WaitVSync(); while (1); //Bucle infinito return 0; /*** Keep gcc happy ***/ }
Apuntes
Pendiente