Seite 1 von 1

Ein Bild in ausführbare Datei einbinden

Verfasst: 4. September 2004 15:11
von martin
Hallo.
Wie kann ich ein Bild in ausführbare Datei einbinden so das sie nicht mehr als separate Datei vorliegen muss.
Es scheint das es am leichtesten über diesen Konstruktor in QPixmap Klasse gehen würde:

Code: Alles auswählen

QPixmap::QPixmap ( const char * xpm[] )
Woher soll ich aber die Daten für diesen Array nehmen.
GLMP kann zwar Bilder als C-Header Datei exportiren, die sind aber nicht im xpm Format.
Weiss also jemand wie Bilder in die ausführbare Datei einbindet??

Vielen Dank im Vor-aus.

Re: Ein Bild in ausführbare Datei einbinden

Verfasst: 6. September 2004 10:07
von Goos
martin hat geschrieben: Woher soll ich aber die Daten für diesen Array nehmen.
GLMP kann zwar Bilder als C-Header Datei exportiren, die sind aber nicht im xpm Format.
Weiss also jemand wie Bilder in die ausführbare Datei einbindet??

Vielen Dank im Vor-aus.
Also ich als Windows Nutzer nehm dafuer immer den GIMP 2 und exportiere nach Pixmap. Ich muss da dann allerdings nochmal mit dem Editor ins xpm rein und das Array auf const aendern.

Goos

Verfasst: 7. September 2004 15:29
von martin
@Goos
Danke für die Antwort.
QT benutze ich nur unter Linux, dennnoch funktioniert deine Lösung einwandfrei.

Schade nur dass xpm unkomprimiert ist, bei grösseren Bildern wechst die Größe der ausfürbaren Datei ganz schnell.
Aber für Icons und kleine Bilder ist das wohl die sauberste Lösung.

Verfasst: 14. September 2004 21:42
von lepsai
noch einfacher ist es QImageIO-funktionen zu benutzen, da Qt ja das XPM-format direkt unterstüzt

QImageIO io;
io.load("bild.bmp");
io.save("bild.xpm");

Verfasst: 4. November 2004 06:18
von Amadeus
Hi,
bischen späte Antwort, aber vielleicht hilfts dir:

1. schreib Dir ein Bin2Asc Programm (vielleicht gibts das auch im Netz, aber mit Qt ist das so schön einfach):

Code: Alles auswählen

	QString fileName = QFileDialog::getOpenFileName();
	if ( fileName.isEmpty() ) return 0;

	QFile f_in( fileName );
	f_in.open( IO_ReadOnly );
	QByteArray ba = f_in.readAll();
	f_in.close();

	QFile f_out( fileName + ".h" );
	f_out.open( IO_WriteOnly );
	QTextStream ts( &f_out );

	ts << "// File: " << fileName << "\n";
	ts << "// Size: " << ba.size() << "\n";
	ts << "static const unsigned char " << QFileInfo(fileName).baseName() << "[] = {\n";

	for (unsigned i=0; i<ba.size(); i++)
	{
		uchar c = ba.at(i);
		QString s = QString::number( c, 16 );
		s = s.rightJustify( 2, '0' );
		
		ts << "0x" << s << ",";
		if ((i+1)%16 == 0) ts << "\n";
	}

	ts << "\n};";
	f_out.close();

2. Damit konvertierst Du dann die Datei, die Du mit in deiner ausführbaren Datei drin haben willst. Da kommt dann eine hübsche Header Datei raus, die Du einfach in Dein Projekt mit einbindest. Die sieht ungefähr so aus:

Code: Alles auswählen

	// File: D:/Workout/Icons.png
	// Size: 36999
	static const unsigned char Icons[] = {
	0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
	0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x08,0x06,0x00,0x00,0x00,0x3e,0x55,0xe9,
	.
	.
	0x73,0xc7,0x19,0x00,0xa8,0x56,0xab,0x9e,0x53,0xfe,0xd5,0x33,0x47,0xcb,0x94,0xff,
	0xff,0x01,0x00,0xa9,0x0e,0x16,0x86,0x28,0x4d,0x2c,0x8b,0x00,0x00,0x00,0x00,0x49,
	0x45,0x4e,0x44,0xae,0x42,0x60,0x82,
	}; 

3. Jetzt musst Du nichts weiter tun, als die Bilddaten zu laden, mit:

Code: Alles auswählen

	QPixmap pm;
	pm.loadFromData( (const unsigned char*) &Icons, 36999 );

Viel Vergnügen...

PS: in der ausführbaren sind das dann natürlich Binärdaten, so das dein Bild nicht wie bei XPM als Text vorliegt!

Verfasst: 6. November 2004 12:06
von BartSimpson
schon mal das tool qtemded benutz? damit soll man bilder in eine .h datei konvertieren können. geht ganz gut. näheres erfährst du aus der qt doku.