Iniciar sesión

Ver la versión completa : Cargar imagen en archivo GPG



ArChEr
09/12/2003, 13:58
Hola buenas! como podria cargar una imagen que hay en un archivo GPG?? Esque no encuentro la funcion para cargar ese tipo de archivo.... Alguien podria indicarme donde encontrar algun tutorial o algo?

Wave
09/12/2003, 14:56
sacado de mi GPGAMES

unsigned char* cargar_imagen (char direccion[])
{
ERR_CODE err;
unsigned long dat_size, total_size;
ERR_CODE err_code;
F_HANDLE h_rfile;
unsigned char* dibujo;
err = GpFileOpen(direccion, OPEN_R, &h_rfile);
if (err != SM_OK)return;
GpFileRead(h_rfile, &dat_size,4,&total_size);
/*aqui en realidad se carga la anchura pero yo no la usaba */
GpFileRead(h_rfile, &dat_size,4,&total_size);
/*aqui en realidad se carga la altura pero yo no la usaba */
dibujo = (unsigned char*)gp_mem_func.malloc(dat_size);
GpFileRead(h_rfile,(unsigned char *)dibujo,dat_size,&total_size);
GpFileClose(h_rfile);
return dibujo;
}

ArChEr
09/12/2003, 16:56
Muchas gracias Wave... Esa funcion sirve para cargar mas de una foto dentro del GPG es decir que dentro del GPG haya mas de una imagen y poder cargar la imagen que yo quiera... Es posible? o se tendria que implementar?

Miki-chan
10/12/2003, 20:43
Originalmente anunciado por Wave

GpFileRead(h_rfile, &dat_size,4,&total_size);
/*aqui en realidad se carga la anchura pero yo no la usaba */
GpFileRead(h_rfile, &dat_size,4,&total_size);
/*aqui en realidad se carga la altura pero yo no la usaba */


Entonces... ¿esas líneas no hacen falta? Yo estuve el pasado finde intentando cargar una imagen mirando el código que acabas de poner y el Api Reference 2.1.5 y tengo dos problemas:

-La imagen sale en tonos de azul porque no tengo la paleta de colores.
-La imagen sale algo rotada y "estirada", vamos que se deforma.

Lo de la paleta, tengo un programa que me permite generar la imagen como fichero gpg y también como "fichero .c + fichero .h" siendo el .h la paleta de colores por lo que creo que debería utilizar esa paleta en la GP con las funciones de inicializar paleta y demás historias, pero... problema:

-La paleta que me crea el programa es un tipo_de_dato imagen[13] y debería ser tipo_de_dato imagen[256], ¿cómo lo podría hacer? ¿Rellenando el resto con 0x00 hasta completar los 256?

A ver si alguien me puede echar un cable porque tengo muy poco tiempo y encima es un coñazo tener que conectar la GP cada 2 minutos para probar, apagar y segir en el PC, volver a pasarlo, volver a probarlo...

Wave
10/12/2003, 20:53
Pero mujer, usa el emu! :D
De todos modos tienes que coger la paleta con el .h, estas segura de que conviertes una imagen de 256 colores???
Lo de la anchura y altura no me hacia falta pq las ponia yo a mano.

Miki-chan
10/12/2003, 21:22
Pues la verdad es que no estoy muy segura de si la imagen tiene los 256 colores... Lo miraré a ver.

Gracias :)

mortimor
10/12/2003, 22:57
Pues lo de la paleta es importante. Normalmente con el mismo programa con el que conviertes las imagenes a .h o a .gpg se convierte la paleta (de hecho te da la opcion de hacerlo o no).

Miki-chan
13/12/2003, 15:09
Buenas, no quería responder nada más hasta poder probar lo de la paleta (ahora el problema es con el compilador, pero bueno declarando la paleta dentro del propio gpmain.c lo he hecho funcionar), el problema ahora es cómo sale la imagen...

Os pongo una foto:

No sé porqué se deforma de esa manera, el código yo creo que está bien, ¿puede que sea fallo del programa que la convierte de bmp a gpg? ¿Qué programas usáis vosotros? Yo he probado dos, uno no tiraba y el otro me deja la imagen así. Si creeis que el fallo puede ser del código fuente, lo puedo subir también.

Wave
13/12/2003, 15:37
De momento pega el trozo de codigo.
Yo uso el GP32converter.

mortimor
13/12/2003, 15:52
Pues yo tambien uso el GP32 Converter.

Por cierto eso huele a offset en el inicio de los datos de imagen. Seguro que hay un error en el codigo.

Miki-chan
13/12/2003, 15:57
Bueno, aquí pongo todo el código. Lo que pone la imagen en pantalla está abajo del todo y en negrita, pero como tiene comentarios varios, puede que le venga bien a alguien el resto del código:

#include<gpdef.h>
#include<gpstdio.h>
#include<gpstdlib.h>
#include<gpgraphic.h>
//#include<paletas.c>

GP_PALETTEENTRY paleta[256] = {
0x0001, 0x0015, 0x002B, 0x003F, 0x0181, 0x0195, 0x01AB, 0x01BF, 0x0281,
0x0295, 0x02AB, 0x02BF, 0x0301, 0x0315, 0x032B, 0x033F, 0x03C1, 0x03D5,
0x03EB, 0x03FF, 0x0541, 0x0555, 0x056B, 0x057F, 0x0641, 0x0655, 0x066B,
0x067F, 0x07C1, 0x07D5, 0x07EB, 0x07FF, 0x3001, 0x3015, 0x302B, 0x303F,
0x3181, 0x3195, 0x31AB, 0x31BF, 0x3281, 0x3295, 0x32AB, 0x32BF, 0x3301,
0x3315, 0x332B, 0x333F, 0x33C1, 0x33D5, 0x33EB, 0x33FF, 0x3541, 0x3555,
0x356B, 0x357F, 0x3641, 0x3655, 0x366B, 0x367F, 0x37C1, 0x37D5, 0x37EB,
0x37FF, 0x5001, 0x5015, 0x502B, 0x503F, 0x5181, 0x5195, 0x51AB, 0x51BF,
0x5281, 0x5295, 0x52AB, 0x52BF, 0x5301, 0x5315, 0x532B, 0x533F, 0x53C1,
0x53D5, 0x53EB, 0x53FF, 0x5541, 0x5555, 0x556B, 0x557F, 0x5641, 0x5655,
0x566B, 0x567F, 0x57C1, 0x57D5, 0x57EB, 0x57FF, 0x6001, 0x6015, 0x602B,
0x603F, 0x6181, 0x6195, 0x61AB, 0x61BF, 0x6281, 0x6295, 0x62AB, 0x62BF,
0x6301, 0x6315, 0x632B, 0x633F, 0x63C1, 0x63D5, 0x63EB, 0x63FF, 0x6541,
0x6555, 0x656B, 0x657F, 0x6641, 0x6655, 0x666B, 0x667F, 0x67C1, 0x67D5,
0x67EB, 0x67FF, 0x7801, 0x7815, 0x782B, 0x783F, 0x7981, 0x7995, 0x79AB,
0x79BF, 0x7A81, 0x7A95, 0x7AAB, 0x7ABF, 0x7B01, 0x7B15, 0x7B2B, 0x7B3F,
0x7BC1, 0x7BD5, 0x7BEB, 0x7BFF, 0x7D41, 0x7D55, 0x7D6B, 0x7D7F, 0x7E41,
0x7E55, 0x7E6B, 0x7E7F, 0x7FC1, 0x7FD5, 0x7FEB, 0x7FFF, 0xA801, 0xA815,
0xA82B, 0xA83F, 0xA981, 0xA995, 0xA9AB, 0xA9BF, 0xAA81, 0xAA95, 0xAAAB,
0xAABF, 0xAB01, 0xAB15, 0xAB2B, 0xAB3F, 0xABC1, 0xABD5, 0xABEB, 0xABFF,
0xAD41, 0xAD55, 0xAD6B, 0xAD7F, 0xAE41, 0xAE55, 0xAE6B, 0xAE7F, 0xAFC1,
0xAFD5, 0xAFEB, 0xAFFF, 0xC801, 0xC815, 0xC82B, 0xC83F, 0xC981, 0xC995,
0xC9AB, 0xC9BF, 0xCA81, 0xCA95, 0xCAAB, 0xCABF, 0xCB01, 0xCB15, 0xCB2B,
0xCB3F, 0xCBC1, 0xCBD5, 0xCBEB, 0xCBFF, 0xCD41, 0xCD55, 0xCD6B, 0xCD7F,
0xCE41, 0xCE55, 0xCE6B, 0xCE7F, 0xCFC1, 0xCFD5, 0xCFEB, 0xCFFF, 0xF801,
0xF815, 0xF82B, 0xF83F, 0xF981, 0xF995, 0xF9AB, 0xF9BF, 0xFA81, 0xFA95,
0xFAAB, 0xFABF, 0xFB01, 0xFB15, 0xFB2B, 0xFB3F, 0xFBC1, 0xFBD5, 0xFBEB,
0xFBFF, 0xFD41, 0xFD55, 0xFD6B, 0xFD7F, 0xFE41, 0xFE55, 0xFE6B, 0xFE7F,
0xFFC1, 0xFFD5, 0xFFEB, 0xFFFF};

void GpMain( void * arg) //siempre lleva lo del parentesis, sin ello NO compila
{
unsigned char * imagen; //declara una variable con la que podremos cargar una imagen
unsigned long data_size, total_size; //define los tamaños de los datos del GpFileRead
ERR_CODE err; //Guarda el valor que devuelve GpFileOpen, este valor será SM_OK si se ha abierto correctamente
F_HANDLE h_rfile; //Es el equivalente a la variable FILE * de C

GPDRAWSURFACE gpDraw; //Es la variable de pantalla
GP_HPALETTE h_pal; //Es la variable de la paleta de color

GpLcdSurfaceGet(&gpDraw,0); //Toma el estado de la pantalla LCD, en este caso, el tamaño

GpSurfaceSet(&gpDraw); //Establece gpDraw como la superficie sobre la que podremos dibujar o colocar objetos
GpLcdEnable(); //Activa la pantalla LCD ¿Es realmente necesario?

GpFatInit(); //Inicializa la SMC. Lo necesitamos SIEMPRE que vayamos a leer/escribir en la SMC

h_pal=GpPaletteCreate(256,(GP_PALETTEENTRY *)paleta); //Crea la paleta de la imagen

GpPaletteSelect(h_pal); //Selecciona una paleta

GpPaletteRealize(); //Carga la paleta en el Hard

h_pal=NULL;

err=GpFileOpen("gp:\\gpmm\\imagen.gpg",OPEN_R,&h_rfile);
//Abre el fichero imagen.gpg de la ruta especificada, en modo apertura (OPEN_R) y lo abre con la variable h_rfile

if(err!=SM_OK) //Comprueba si el fichero se ha abierto correctamente. Si no es así, sale del programa
{
return;
}

GpFileRead(h_rfile,&data_size,4,&total_size);
GpFileRead(h_rfile,&data_size,4,&total_size);

imagen=(unsigned char *)gp_mem_func.malloc(data_size);
//Aloca espacio del tamaño data_size en la variable imagen (imagen es un puntero). Malloc funciona igual que en C

GpFileRead(h_rfile,(unsigned char *)imagen,data_size,&total_size);
//Lee el contenido del fichero sobre la variable imagen. A diferencia de C lleva primero el fichero del que leemos, la variable sobre la que leemos, el tamaño de lo leído y el tamaño total de todo lo leído.
GpFileClose(h_rfile); //Cierra el fichero

GpRectFill(NULL,&gpDraw,0,0,gpDraw.buf_w,gpDraw.buf_h,0x00);
//Pinta la superficie gpDraw de negro

while(1) //Bucle infinito que mantiene el programa siempre en ejecución
{
GpBitBlt(NULL,&gpDraw,0,0,320,240,(unsigned char *)imagen,0,0,320,240);
//Coloca la imagen del puntero imagen en la pantalla
}
}

Wave
13/12/2003, 17:00
el bmp era de 320x240???

Miki-chan
13/12/2003, 19:27
Si, el bmp me lo crearon como fondo de escritorio del Wind-ups.

mragonias
13/12/2003, 19:46
Esa imagen deformada me ha traido recuerdos cuando hice el mapa de BCN para el imappy. Muchas de las imagenes me salian así deformadas. El problema estaba cuando retocaba las fotos en el photoshop para ponerlas a 320x240. Hacia un paso que provocaba que las imagenes en el geepee (y en la gp32) se viesen con esa deformacion, pero en cambio si tu la mirabas con cualquier visor de imagenes se veia bien. Fué una agonia:D para mi, hasta que descubri el problema. Si todavia no has rectificado ese fallo dimelo, que averiguaré como lo hice para rectificarlo.

Miki-chan
13/12/2003, 21:11
Vaya, esa me la hicieron con photoshop o eso creo, pero yo no lo tengo.

El que yo uso para las fotos es el Corel Draw o el Corel Photo Paint, pero parece que va a tener el mismo fallo porque antes de probar con esta, probé con una foto modificada con el Corel Draw y también salía deformada así :(

mortimor
13/12/2003, 21:54
Yo uso el Corel Photo Paint y se debe al formato de linea, todas las lineas de un bmp deben tener un numero de bytes igual a un multiplo de 32, por lo tanto se insertan bytes vacios para rellenar. Eso se debe al windows, y hay programas que saltan los bytes vacios y otros que no.

Miki-chan
13/12/2003, 22:02
Y con el GP32Converter, ¿Te salen bien las imágenes? porque entonces me interesa bajármelo, ya que las imágenes se me crean así siempre.

No sabía yo que se debía el problema al programa para modificar las imágenes (cuando las veo con el Wind-ups, salen bien).

mortimor
13/12/2003, 22:15
A mi no me ha dado ningun problema.

Miki-chan
13/12/2003, 22:22
Me dice que le falta el archivo VB6FR.DLL

|Wesker|
13/12/2003, 22:34
Aqui tienes el archivo q te falta, si tienes win 95/98 metelo en windows\system; en el caso del win2k en winnt\system32 (en XP supongo que igual)

Salu2 ;)

Miki-chan
13/12/2003, 22:50
Ahora me da un error no especificado. Esto me vacila :confused:

Miki-chan
14/12/2003, 15:54
Ya funciona :) :) :) :) Muchísimas gracias a todos, sin vosotros creo que no hubiese conseguido hacer lo de las imágenes :) :) :) :)

Lo del error ese fue una ida de olla de mi PC, pero hoy lo he usado y me ha ido perfecto. Ya puedo seguir avanzando para poder hacer juegos (uno de mis proyectos lleva muchísimas imágenes y era un gran problema que no se creasen bien). Aquí el resultado:

mortimor
14/12/2003, 16:10
Sorry!! I forgot put that file in the .ace

Congratulations MIKI!!! :)