Hola, para un proyecto que tengo en mente necesito que el screenshot no ocupe los 256x192 pixeles si no los 85x85 primeros.
He intentado cambiar los numeros para adaptarlo pero o la imagen no se veia bien o salia fatal.
El codigo:
#include <nds.h> #include <stdlib.h> #include <stdio.h> #include <fat.h> #include "screenshot.h" #include "bmp.h" void wait(); void screenshot(u8* buffer) { u8 vram_cr_temp=VRAM_A_CR; VRAM_A_CR=VRAM_A_LCD; u8* vram_temp=(u8*)malloc(128*1024); dmaCopy(VRAM_A, vram_temp, 128*1024); REG_DISPCAPCNT=DCAP_BANK(0)|DCAP_ENABLE|DCAP_SIZE(3); while(REG_DISPCAPCNT & DCAP_ENABLE); dmaCopy(VRAM_A, buffer, 256*192*2); dmaCopy(vram_temp, VRAM_A, 128*1024); VRAM_A_CR=vram_cr_temp; free(vram_temp); } void screenshot(char* filename) { fatInitDefault(); FILE* file=fopen(filename, "w"); u8* temp=(u8*)malloc(256*192*2); dmaCopy(VRAM_B, temp, 256*192*2); fwrite(temp, 1, 256*192*2, file); fclose(file); free(temp); } void write16(u16* address, u16 value) { u8* first=(u8*)address; u8* second=first+1; *first=value&0xff; *second=value>>8; } void write32(u32* address, u32 value) { u8* first=(u8*)address; u8* second=first+1; u8* third=first+2; u8* fourth=first+3; *first=value&0xff; *second=(value>>8)&0xff; *third=(value>>16)&0xff; *fourth=(value>>24)&0xff; } void screenshotbmp(char* filename) { fatInitDefault(); FILE* file=fopen(filename, "wb"); REG_DISPCAPCNT=DCAP_BANK(3)|DCAP_ENABLE|DCAP_SIZE(3); while(REG_DISPCAPCNT & DCAP_ENABLE); u8* temp=(u8*)malloc(256*192*3+sizeof(INFOHEADER)+sizeof(HEADER)); HEADER* header=(HEADER*)temp; INFOHEADER* infoheader=(INFOHEADER*)(temp+sizeof(HEADER)); write16(&header->type, 0x4D42); write32(&header->size, 256*192*3+sizeof(INFOHEADER)+sizeof(HEADER)); write32(&header->offset, sizeof(INFOHEADER)+sizeof(HEADER)); write16(&header->reserved1, 0); write16(&header->reserved2, 0); write16(&infoheader->bits, 24); write32(&infoheader->size, sizeof(INFOHEADER)); write32(&infoheader->compression, 0); write32(&infoheader->width, 256); write32(&infoheader->height, 192); write16(&infoheader->planes, 1); write32(&infoheader->imagesize, 256*192*3); write32(&infoheader->xresolution, 0); write32(&infoheader->yresolution, 0); write32(&infoheader->importantcolours, 0); write32(&infoheader->ncolours, 0); for(int y=0;y<192;y++) { for(int x=0;x<256;x++) { u16 color=VRAM_D[256*192-y*256+x]; u8 b=(color&31)<<3; u8 g=((color>>5)&31)<<3; u8 r=((color>>10)&31)<<3; temp[((y*256)+x)*3+sizeof(INFOHEADER)+sizeof(HEADER)]=r; temp[((y*256)+x)*3+1+sizeof(INFOHEADER)+sizeof(HEADER)]=g; temp[((y*256)+x)*3+2+sizeof(INFOHEADER)+sizeof(HEADER)]=b; } } DC_FlushAll(); fwrite(temp, 1, 256*192*3+sizeof(INFOHEADER)+sizeof(HEADER), file); fclose(file); free(temp); }
Salu2
Primero: No copies código
Primero: No copies código de un ejemplo sin más si no lo entiendes. No me digas que lo entiendes porque has copiado el archivo tal cual sin molestarte en quitar tan siquiera las funciones que no sirven para lo que quieres.
Segundo:
Me he tomado la libertad de retocar un poco el código... Ni lo he probado ni tengo ganas, pero debería funcionar. Por cierto, yo que tu añadiría comprobaciones de error porque ahí hay un par de funciones que pueden fallar con relativa facilidad...
Saludos.
Lo he puesto tal y como lo
Lo he puesto tal y como lo has puesto y nisiquera creo el bmp...
Si yo tengo puesto la ruta
Si yo tengo puesto la ruta en la raiz, es mas antes de modificarlo hacia la imagen, me tendre que conformar con hacer la captura de la pantalla entera...
Si...y te digo de que
Si...y te digo de que funciona porque lo he probado y lo grabo perfectamente, pero lo necesito para 85x85 no para 256x192.
Salu2
De todos modos estoy
De todos modos estoy pensando que por una limitación de los BMP el archivo que crease podría estar corrupto... Olvídate de 85x85...
Prueba cambiando
u8* temp=(u8*)calloc(85*85*3+sizeof(INFOHEADER)+sizeof(HEADER),1);
a ver si cuela.
Me sale un error, según el
Me sale un error, según el mismo el error es que memset no es declarado, ¿qué tengo que incluir para que lo reconzoca?.
stdlib.h, string.h... no se,
stdlib.h, string.h... no se, prueba. Creo que es string.h.
Ahora se ha quedado pillado
Ahora se ha quedado pillado al llamar la función, no quiero ser pesado...
Salu2
Añade las comprobaciones de
Añade las comprobaciones de error que hagan falta. Lo que me dices no me vale para nada, se puede pillar el código por muchos motivos.
Poner el handler de
Poner el handler de excepciones por una chorrada como esta es una gilipollez... Se pueden comprobar si los punteros que devuelve malloc no son nulos, si las funciones de fat no devuelven error... Y es mucho mejor porque hasta puedes controlar los errores durante la ejecución del programa.
Has dado en el clavo es eso
Has dado en el clavo es eso lo que voy a hacer xD.
Y no seria mas facil usar
Y no seria mas facil usar sprites?. Un sprite de 64x64 y otro de 32x32 con rellenito de magenta. Listo.
Vamos pienso yo XDD.
Mi creacciónes particulares:
http://www.scenebeta.com/noticia/la-serpiente
http://www.scenebeta.com/node/22535