Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Bittikartan kirjoittaminen

punppis [09.08.2012 23:15:34]

#

Yritän luoda c++:lla bittikartan tyhjästä. Koodi toimii tällä hetkellä vain 100x100 kokoisille kuville. Katsoin speksejä Wikipediasta.

void WriteInt(fstream &file, int _int)
{
	char temp[4];
	temp[3] = _int >> 24;
	temp[2] = _int >> 16;
	temp[1] = _int >> 8;
	temp[0] = _int << 24 >> 24;

	file.write(temp, 4);
}

void WriteShort(fstream &file, short _short)
{
	char temp[2];
	temp[1] = _short >> 8;
	temp[0] = _short;

	file.write(temp, 2);
}

void CreateBitmap(std::string filename, int width, int height, short bits_per_channel, unsigned char* pixeldata)
{
	fstream myfile;
	myfile.open (filename, std::ios::binary | std::ios::out);

	short bits = bits_per_channel * 3;

	int header_size = 14;
	int dib_size = 40;

	int filesize = header_size+dib_size+width*height*3;

	// bitmap file header
	myfile << 'B' << 'M'; // bmp header
	WriteInt(myfile, filesize); // file size in bytes
	WriteInt(myfile, 0); // 2x 2-byte reserved
	WriteInt(myfile, header_size+dib_size); // pixel data offset

	// DIB header
	WriteInt(myfile, dib_size); // size of header in bytes
	WriteInt(myfile, width); // width in pixels
	WriteInt(myfile, height); // height in pixels
	WriteShort(myfile, 1); // has to be 1
	WriteShort(myfile, bits); // bits per pixel
	WriteInt(myfile, 0); // compression method (0 = none)
	WriteInt(myfile, width*height*3); // size of raw bitmap data
	WriteInt(myfile, 100); // horizontal resolution (pixel per meter)
	WriteInt(myfile, 100); // vertical resolution (pixel per meter)
	WriteInt(myfile, 0); // number of colors in palette
	WriteInt(myfile, 0); // number of important colors used

	// pixel data
	for(int i=0;i<width*height*3;i+=3)
	{
		myfile << pixeldata[i+2]; // b
		myfile << pixeldata[i+1]; // g
		myfile << pixeldata[i]; // r
	}

	myfile.close();
}

int main()
{
	srand(time(NULL)); // random seed

	int w = 100;
	int h = 100;

	unsigned char* yeah = new unsigned char[w*h*3];
	for(int i=0;i<w*h*3;i+=3)
	{
		yeah[i] = 255; // r
		yeah[i+1] = 255; // g
		yeah[i+2] = 255; // b
	}

	remove("media/yeah_buddy.bmp");
	CreateBitmap("media/yeah_buddy.bmp", w, h, 8, yeah);

	for(int i=0;i<w*h*3;i+=3)
	{
		yeah[i] = rand() % 255;
		yeah[i+1] = rand() % 255;
		yeah[i+2] = rand() % 255;
	}

	remove("media/yeah_buddy_2.bmp");
	CreateBitmap("media/yeah_buddy_2.bmp", w, h, 8, yeah);

	delete[] yeah;
}

Grez [10.08.2012 02:31:14]

#

WriteIntin vähitenmerkitsevän tavun muodostamiskoodi näyttää aika erikoiselta, joskin tuskin vaikuttaa mihinkään. Se on myöskin epäyhteneväinen WriteShortin kanssa.

En suuremmin alkanut tutkia, mutta jos haluat pystyä tallentamaan muitakin kuin 4 jaollisen levyisiä bittikarttoja tuossa formaatissa, niin rivin leveydestä täytyisi tehdä kuitenkin 4:llä tavulla jaollinen, kuten mainitsemasi Wikipedia-artikkelin kappaleessa Pixel storage kerrotaankin.

punppis [10.08.2012 19:09:51]

#

Tarkoittanet tuota bittisiftausta eestaas WriteIntissä, joku aivopieru päässyt koodiin. Pitänee lukea vähän tarkemmin noita speksejä.

jalski [13.08.2012 14:40:19]

#

punppis kirjoitti:

Tarkoittanet tuota bittisiftausta eestaas WriteIntissä, joku aivopieru päässyt koodiin..

Itse varmaan laiskuuttani antaisin kääntäjän tehdä laskemisen käyttämällä unionia liittämään integerin tavut oikeisiin komponentteihin ja kirjoittaisin nuo sitten yksinkertaisesti tavu kerrallaan oikeassa järjestyksessä...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta