Anuncios Google

Pasar el screenshot de 256x192 a 85x85.

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



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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:

#include <nds.h>
#include <stdlib.h>
#include <stdio.h>
 
#include "bmp.h"
 
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) {
 
	FILE* file=fopen(filename, "wb");
 
	vramSetBankD(VRAM_D_LCD);
	REG_DISPCAPCNT=DCAP_BANK(3)|DCAP_ENABLE|DCAP_SIZE(3);
	while(REG_DISPCAPCNT & DCAP_ENABLE);
 
	u8* temp=(u8*)calloc(85*85*3+sizeof(INFOHEADER)+sizeof(HEADER),1);
 
	HEADER* header=(HEADER*)temp;
	INFOHEADER* infoheader=(INFOHEADER*)(temp+sizeof(HEADER));
 
	write16(&header->type, 0x4D42);
	write32(&header->size, 85*85*3+sizeof(INFOHEADER)+sizeof(HEADER));
	write32(&header->offset, sizeof(INFOHEADER)+sizeof(HEADER));
 
	write16(&infoheader->bits, 24);
	write32(&infoheader->size, sizeof(INFOHEADER));
	write32(&infoheader->width, 85);
	write32(&infoheader->height, 85);
	write16(&infoheader->planes, 1);
	write32(&infoheader->imagesize, 85*85*3);
 
	for(int y=0;y<85;y++) for(int x=0;x<85;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*85)+x)*3+sizeof(INFOHEADER)+sizeof(HEADER)]=r;
		temp[((y*85)+x)*3+1+sizeof(INFOHEADER)+sizeof(HEADER)]=g;
		temp[((y*85)+x)*3+2+sizeof(INFOHEADER)+sizeof(HEADER)]=b;
	}
 
	DC_FlushAll();
	fwrite(temp, 1, 85*85*3+sizeof(INFOHEADER)+sizeof(HEADER), file);
	fclose(file);
	free(temp);
}

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.

Imagen de The Dark Master

Lo he puesto tal y como lo

Lo he puesto tal y como lo has puesto y nisiquera creo el bmp...

Imagen de The Dark Master

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...


Imagen de The Dark Master

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);

 

por

u8* temp=(u8*)malloc(85*85*3+sizeof(INFOHEADER)+sizeof(HEADER));
memset(temp, 0, 85*85*3+sizeof(INFOHEADER)+sizeof(HEADER));


a ver si cuela.
Imagen de The Dark Master

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.

Imagen de The Dark Master

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.

Imagen de The Dark Master

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.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.