• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

overblue

Guardar 1 bmp em C

12 mensagens neste tópico

Bem-vindo ao fórum.

Se eu soubesse o que é um bmp ainda poderia dizer se sei ou não...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem-vindo ao fórum.

Se eu soubesse o que é um bmp ainda poderia dizer se sei ou não...

Não sabes o que é um .BMP? :eek:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não sabes o que é um .BMP? :eek:

Isso claro que sei, mas ele não disse um .bmp, disse um bmp e isso pode ter muitos significados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol... és mesmo mesquinho pah... deixa de gozar com as pessoas, sabias bem ao que ele se referia :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem-vindo ao fórum.

Se eu soubesse o que é um bmp ainda poderia dizer se sei ou não...

ok ok peço desculpa pelo meu portugues... :thumbsup:

o que estou a tentar fazer é guardar um screenshot em C. tirar o screenshot é facil a parte complicada para mim é guarda-lo num ficheiro... :-[ :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem.... Pelo que disseste tens que guardar o screenshot num long e depois gravar num ficheiro binário com extensão .bmp.... Penso que isto é possivel.


long int screenshot = screenshot_func();
FILE *fp = fopen("nomedaimg.bmp", "wb");
fwrite(&screenshot, sizeof(screenshot), 1, fp);
fclose(fp);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso eu já sabia...

Só que le disse que já tinha forma de tirar o screenshot.. Por isso presumi que podia guardar a imagem numa variavel.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@tsenart:

Um screenshot em bmp fica com um tamanho na ordem dos megabytes, não estou a ver um ficheiro desse tamanho caber num long int :P

@overblue:

É como o shumy disse, vês como é o formato bmp (não é nada difícil, se bem me lembro das aulas de Computação Gráfica) e guardas para lá os valores que tiras do screenshot em conformidade com a especificação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui fica um pequeno exemplo... isto é um conversor proof-of-concept de sprites para ficheiros .BMP, mas já dá para teres uma ideia de como funciona o formato.

// GRAPHICS EXTRACTION PROGRAM FOR TRICKY QUIKY GAMES 2

#include <cstdio>
#include <string>
#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
WIN32_FIND_DATA wfd;
HANDLE fHandle = FindFirstFile("*.SRB",&wfd);

const unsigned char bmpheader1 [18] = {0x42, 0x4D, 0x2E, 0x07, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00};

const unsigned char bmpheader2 [1052] = {0x01, 0x00, 0x08, 0x00, 0x00, 0x00,
	0x00, 0x00, 0xF8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
	0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80,
	0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xDC, 0xC0, 0x00, 0xF0, 0xCA,
	0xA6, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x20,
	0x80, 0x00, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0xC0, 0x00, 0x00, 0x20,
	0xE0, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x40,
	0x40, 0x00, 0x00, 0x40, 0x60, 0x00, 0x00, 0x40, 0x80, 0x00, 0x00, 0x40,
	0xA0, 0x00, 0x00, 0x40, 0xC0, 0x00, 0x00, 0x40, 0xE0, 0x00, 0x00, 0x60,
	0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x60, 0x40, 0x00, 0x00, 0x60,
	0x60, 0x00, 0x00, 0x60, 0x80, 0x00, 0x00, 0x60, 0xA0, 0x00, 0x00, 0x60,
	0xC0, 0x00, 0x00, 0x60, 0xE0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80,
	0x20, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x80,
	0x80, 0x00, 0x00, 0x80, 0xA0, 0x00, 0x00, 0x80, 0xC0, 0x00, 0x00, 0x80,
	0xE0, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0xA0, 0x20, 0x00, 0x00, 0xA0,
	0x40, 0x00, 0x00, 0xA0, 0x60, 0x00, 0x00, 0xA0, 0x80, 0x00, 0x00, 0xA0,
	0xA0, 0x00, 0x00, 0xA0, 0xC0, 0x00, 0x00, 0xA0, 0xE0, 0x00, 0x00, 0xC0,
	0x00, 0x00, 0x00, 0xC0, 0x20, 0x00, 0x00, 0xC0, 0x40, 0x00, 0x00, 0xC0,
	0x60, 0x00, 0x00, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0xA0, 0x00, 0x00, 0xC0,
	0xC0, 0x00, 0x00, 0xC0, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xE0,
	0x20, 0x00, 0x00, 0xE0, 0x40, 0x00, 0x00, 0xE0, 0x60, 0x00, 0x00, 0xE0,
	0x80, 0x00, 0x00, 0xE0, 0xA0, 0x00, 0x00, 0xE0, 0xC0, 0x00, 0x00, 0xE0,
	0xE0, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x40, 0x00,
	0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x40, 0x00, 0x80, 0x00, 0x40, 0x00,
	0xA0, 0x00, 0x40, 0x00, 0xC0, 0x00, 0x40, 0x00, 0xE0, 0x00, 0x40, 0x20,
	0x00, 0x00, 0x40, 0x20, 0x20, 0x00, 0x40, 0x20, 0x40, 0x00, 0x40, 0x20,
	0x60, 0x00, 0x40, 0x20, 0x80, 0x00, 0x40, 0x20, 0xA0, 0x00, 0x40, 0x20,
	0xC0, 0x00, 0x40, 0x20, 0xE0, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40,
	0x20, 0x00, 0x40, 0x40, 0x40, 0x00, 0x40, 0x40, 0x60, 0x00, 0x40, 0x40,
	0x80, 0x00, 0x40, 0x40, 0xA0, 0x00, 0x40, 0x40, 0xC0, 0x00, 0x40, 0x40,
	0xE0, 0x00, 0x40, 0x60, 0x00, 0x00, 0x40, 0x60, 0x20, 0x00, 0x40, 0x60,
	0x40, 0x00, 0x40, 0x60, 0x60, 0x00, 0x40, 0x60, 0x80, 0x00, 0x40, 0x60,
	0xA0, 0x00, 0x40, 0x60, 0xC0, 0x00, 0x40, 0x60, 0xE0, 0x00, 0x40, 0x80,
	0x00, 0x00, 0x40, 0x80, 0x20, 0x00, 0x40, 0x80, 0x40, 0x00, 0x40, 0x80,
	0x60, 0x00, 0x40, 0x80, 0x80, 0x00, 0x40, 0x80, 0xA0, 0x00, 0x40, 0x80,
	0xC0, 0x00, 0x40, 0x80, 0xE0, 0x00, 0x40, 0xA0, 0x00, 0x00, 0x40, 0xA0,
	0x20, 0x00, 0x40, 0xA0, 0x40, 0x00, 0x40, 0xA0, 0x60, 0x00, 0x40, 0xA0,
	0x80, 0x00, 0x40, 0xA0, 0xA0, 0x00, 0x40, 0xA0, 0xC0, 0x00, 0x40, 0xA0,
	0xE0, 0x00, 0x40, 0xC0, 0x00, 0x00, 0x40, 0xC0, 0x20, 0x00, 0x40, 0xC0,
	0x40, 0x00, 0x40, 0xC0, 0x60, 0x00, 0x40, 0xC0, 0x80, 0x00, 0x40, 0xC0,
	0xA0, 0x00, 0x40, 0xC0, 0xC0, 0x00, 0x40, 0xC0, 0xE0, 0x00, 0x40, 0xE0,
	0x00, 0x00, 0x40, 0xE0, 0x20, 0x00, 0x40, 0xE0, 0x40, 0x00, 0x40, 0xE0,
	0x60, 0x00, 0x40, 0xE0, 0x80, 0x00, 0x40, 0xE0, 0xA0, 0x00, 0x40, 0xE0,
	0xC0, 0x00, 0x40, 0xE0, 0xE0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00,
	0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x80, 0x00, 0x60, 0x00, 0x80, 0x00,
	0x80, 0x00, 0x80, 0x00, 0xA0, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x00,
	0xE0, 0x00, 0x80, 0x20, 0x00, 0x00, 0x80, 0x20, 0x20, 0x00, 0x80, 0x20,
	0x40, 0x00, 0x80, 0x20, 0x60, 0x00, 0x80, 0x20, 0x80, 0x00, 0x80, 0x20, 
	0xA0, 0x00, 0x80, 0x20, 0xC0, 0x00, 0x80, 0x20, 0xE0, 0x00, 0x80, 0x40,
	0x00, 0x00, 0x80, 0x40, 0x20, 0x00, 0x80, 0x40, 0x40, 0x00, 0x80, 0x40,
	0x60, 0x00, 0x80, 0x40, 0x80, 0x00, 0x80, 0x40, 0xA0, 0x00, 0x80, 0x40,
	0xC0, 0x00, 0x80, 0x40, 0xE0, 0x00, 0x80, 0x60, 0x00, 0x00, 0x80, 0x60,
	0x20, 0x00, 0x80, 0x60, 0x40, 0x00, 0x80, 0x60, 0x60, 0x00, 0x80, 0x60,
	0x80, 0x00, 0x80, 0x60, 0xA0, 0x00, 0x80, 0x60, 0xC0, 0x00, 0x80, 0x60,
	0xE0, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x20, 0x00, 0x80, 0x80,
	0x40, 0x00, 0x80, 0x80, 0x60, 0x00, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
	0xA0, 0x00, 0x80, 0x80, 0xC0, 0x00, 0x80, 0x80, 0xE0, 0x00, 0x80, 0xA0,
	0x00, 0x00, 0x80, 0xA0, 0x20, 0x00, 0x80, 0xA0, 0x40, 0x00, 0x80, 0xA0,
	0x60, 0x00, 0x80, 0xA0, 0x80, 0x00, 0x80, 0xA0, 0xA0, 0x00, 0x80, 0xA0,
	0xC0, 0x00, 0x80, 0xA0, 0xE0, 0x00, 0x80, 0xC0, 0x00, 0x00, 0x80, 0xC0,
	0x20, 0x00, 0x80, 0xC0, 0x40, 0x00, 0x80, 0xC0, 0x60, 0x00, 0x80, 0xC0,
	0x80, 0x00, 0x80, 0xC0, 0xA0, 0x00, 0x80, 0xC0, 0xC0, 0x00, 0x80, 0xC0,
	0xE0, 0x00, 0x80, 0xE0, 0x00, 0x00, 0x80, 0xE0, 0x20, 0x00, 0x80, 0xE0,
	0x40, 0x00, 0x80, 0xE0, 0x60, 0x00, 0x80, 0xE0, 0x80, 0x00, 0x80, 0xE0,
	0xA0, 0x00, 0x80, 0xE0, 0xC0, 0x00, 0x80, 0xE0, 0xE0, 0x00, 0xC0, 0x00,
	0x00, 0x00, 0xC0, 0x00, 0x20, 0x00, 0xC0, 0x00, 0x40, 0x00, 0xC0, 0x00,
	0x60, 0x00, 0xC0, 0x00, 0x80, 0x00, 0xC0, 0x00, 0xA0, 0x00, 0xC0, 0x00,
	0xC0, 0x00, 0xC0, 0x00, 0xE0, 0x00, 0xC0, 0x20, 0x00, 0x00, 0xC0, 0x20,
	0x20, 0x00, 0xC0, 0x20, 0x40, 0x00, 0xC0, 0x20, 0x60, 0x00, 0xC0, 0x20,
	0x80, 0x00, 0xC0, 0x20, 0xA0, 0x00, 0xC0, 0x20, 0xC0, 0x00, 0xC0, 0x20,
	0xE0, 0x00, 0xC0, 0x40, 0x00, 0x00, 0xC0, 0x40, 0x20, 0x00, 0xC0, 0x40,
	0x40, 0x00, 0xC0, 0x40, 0x60, 0x00, 0xC0, 0x40, 0x80, 0x00, 0xC0, 0x40,
	0xA0, 0x00, 0xC0, 0x40, 0xC0, 0x00, 0xC0, 0x40, 0xE0, 0x00, 0xC0, 0x60,
	0x00, 0x00, 0xC0, 0x60, 0x20, 0x00, 0xC0, 0x60, 0x40, 0x00, 0xC0, 0x60,
	0x60, 0x00, 0xC0, 0x60, 0x80, 0x00, 0xC0, 0x60, 0xA0, 0x00, 0xC0, 0x60,
	0xC0, 0x00, 0xC0, 0x60, 0xE0, 0x00, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0x80,
	0x20, 0x00, 0xC0, 0x80, 0x40, 0x00, 0xC0, 0x80, 0x60, 0x00, 0xC0, 0x80,
	0x80, 0x00, 0xC0, 0x80, 0xA0, 0x00, 0xC0, 0x80, 0xC0, 0x00, 0xC0, 0x80,
	0xE0, 0x00, 0xC0, 0xA0, 0x00, 0x00, 0xC0, 0xA0, 0x20, 0x00, 0xC0, 0xA0,
	0x40, 0x00, 0xC0, 0xA0, 0x60, 0x00, 0xC0, 0xA0, 0x80, 0x00, 0xC0, 0xA0,
	0xA0, 0x00, 0xC0, 0xA0, 0xC0, 0x00, 0xC0, 0xA0, 0xE0, 0x00, 0xC0, 0xC0,
	0x00, 0x00, 0xC0, 0xC0, 0x20, 0x00, 0xC0, 0xC0, 0x40, 0x00, 0xC0, 0xC0,
	0x60, 0x00, 0xC0, 0xC0, 0x80, 0x00, 0xC0, 0xC0, 0xA0, 0x00, 0xF0, 0xFB,
	0xFF, 0x00, 0xA4, 0xA0, 0xA0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
	0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00,
	0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF,
	0xFF, 0x00};

int num_of_files = 0;
short width, height;
char buffer [640*400]; // maximum possible sprite size
do
{
	FILE * fsrb = fopen(wfd.cFileName, "rb");
	fseek(fsrb, 258, SEEK_SET); // skip file header

	char number [3] = {0,0,0};
	int i = 0;
	while (!feof(fsrb))
	{
		cout << "File: " << string(wfd.cFileName) << " Sprite: " << i << "\n";
		fseek(fsrb, 6, SEEK_CUR);	// go to first width/height info
		fread(&width, 1, 2, fsrb);	// read sprite width
		fread(&height, 1, 2, fsrb); // read sprite height
		fseek(fsrb, 3, SEEK_CUR);	// go to sprite bitmap
		fread(buffer, 1, width * height, fsrb); // read sprite bitmap

		itoa(i, number, 10);
		FILE * fout = fopen((string(wfd.cFileName) + "." + string(number) + ".bmp").c_str(), "wb");
		fwrite(&bmpheader1, 1, 18, fout);
		long lwidth = width;
		long lheight = height;
		fwrite(&lwidth, 1, 4, fout);
		fwrite(&lheight, 1, 4, fout);
		fwrite(&bmpheader2, 1, 1052, fout);
		for (int j = (height-1) * width; j >= 0; j -= width)
			fwrite(&buffer[j], 1, width, fout); // write sprite (vertically reversed)
		fclose(fout);

		++i;
	}

	fclose(fsrb);
}
while (FindNextFile(fHandle, &wfd));

FindClose(fHandle);

return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora