[gelöst] Bild hart einbauen - wie generiert man die Daten?
-
Hallo zusammen,
Qt hat die Eigenschaft Bilder, die man in Oberflächen integriert (z.B. Logos) in einer Ressourcendatei einzubetten, z.B.static const unsigned char qt_resource_data[] = { 0x0,0x1,0xd9,0x1d, // Name (inkl. Pfad zur Datei) 0x89, 0x50,0x4e,0x47,0xd,0xa,0x1a,0xa /* Noch viel mehr 0x.. hier */ };Meine ganz einfache Frage hierzu: Wie generiere ich ein solches Array selbst?
Ich bräuchte das in einem anderen Projekt nun auch in dieser Form, bin aber irgendwie zu blöd das Array zu erzeugen. Nunja, ich würde nun gern wissen, wie man es (richtig) macht. Da gibts doch sicher auch was von Ratio... (Das ein oder andere OpenSource-Projekt auf Github & Co. wird da doch bestimmt was haben. Also, wenn jemand einen Codeschnipsel, einen Link zu einem Codeschnipsel oder auch geeignete Suchbegriffe hat, wäre ich begeistert.)
Viele Grüße
gelignite
-
Naja, du könntest den rcc von Qt verwenden. Wenn es nicht so viele Farben sein sollen geht auch xpm. convert von ImageMagick konvertiert dahin.
Einen schönen Abend noch
-
Für rudimentäre Sachen geht auch xxd: (kann natürlich nur den Inhalt, den Rest müsstest du selbst machen)
xxd -i bild.png > embedded.coder ähnlich, je nach dem, was du damit machen möchtest.
Bild.png
Hallo xxd!Output:
unsigned char bild_png[] = { 0x48, 0x61, 0x6c, 0x6c, 0x6f, 0x20, 0x78, 0x78, 0x64, 0x21, 0x0a }; unsigned int bild_png_len = 11;
-
Hallo,
vielen Dank für eure beiden Antworten. Den RCC habe ich mir angeschaut und ausprobiert und, naja, damit ginge es wohl auch, wenn sich nichts anderes findet.Ich hatte gestern auch schon zum Teil eine eigene Lösung aus verschiedenen Quellen zusammenkopiert, aber da wurden noch einzelne Werte falsch ausgegeben. Zwischendrin tauchten Werte, wie z.B.
0xfffff89, auf.Die Antwort bezüglich xxd habe ich jetzt erst gesehen. Das werde ich mir bei Gelegenheit vielleicht auch noch einmal näher anschauen.
Viele Grüße
gelignite--------------
P.S.
Zwischenzeitlich konnte ich bei meinem Ansatz aber den Fehler beseitigen und komme auch damit zum Ziel. Der Vollständigkeit halber (für die Nachwelt):
#include <iostream> #include <iomanip> #include <boost\filesystem.hpp> int main( int argc, char** argv ) { boost::filesystem::directory_iterator it( argv[1] ), itEnd; // Walk through given folder for( ; it != itEnd; ++it ) { boost::filesystem::path pFile( it->path() ); if( pFile.extension().string() == ".exe" ) { std::cout << "Skipping " << pFile.string() << " ..." << std::endl; } else { std::cout << "Processing " << pFile.string() << " ..." << std::endl; //read std::ifstream input( pFile.string(), std::ios::binary ); std::vector<char> buffer( (std::istreambuf_iterator<char>(input)), (std::istreambuf_iterator<char>()) ); //write (formatted) const int iSize = buffer.size(); std::string sOutfile( pFile.replace_extension( ".txt" ).string() ); std::ofstream out( sOutfile, std::ofstream::binary ); out << "static const unsigned char " << pFile.filename().stem().string() << "_" << pFile.filename().extension().string().substr(1) // remove "." from ".ext" << "[] = {" << '\r' << '\n'; out << std::hex << std::setfill('0'); for( int i = 0; i < iSize; ++i ) { // line break every 16 bytes if( i > 0 && i % 16 == 0 ) { out << '\r' << '\n'; } out << "0x" << std::setw(2) << static_cast<int>( *reinterpret_cast<unsigned char*>( &buffer[i] )); // separator if( i < iSize - 1 ) { out << ","; } } out << '\r' << '\n' << "};"; out.close(); } } return 0; }