Seite 1 von 1

Pixel setzen?

Verfasst: 27. Juli 2008 17:54
von Timebeast
Hallo,
Ich habe gerade ein kleines QT Verständnis, bzw. verständigungs Problem.
1. Ich lade eine Datei in einen Array. klappt wunderbar.
Anmerkung: Die Datei ist Byte orientiert.
2. Die einzelnen Bytes sind Pixel. Das Format ist 332 (RGB). Also z.B. 111 000 00 würde ein rotes Pixel darstellen.
4. Das Bild ist 80x60Pixel groß.
3. Jetzt möchte ich mir diese Pixel halt grafisch anzeigen lassen. Im Prinzip einfach die Pixel je nach Wert setzten.

Was mich verwirrt ist die unglaubliche Fülle an Befehlen Konfigurationen, Vorwissen zum Aufbau (nebst Farbtabellen, Header, usw. usw.) hab ich alles nicht! Ich hab nur Farbwerte und die größe.

Es geht schon mit dem Ausgabe Modul los. Soll ich Label nehmen? Was anderes geht nämlich nicht, bzw. ist nicht auswählbar. Ich hab in verschiedenen Threads gelesen das irgendein Pixel-label oder so verwendet wird? Qimage vielleicht, aber auch das gibt es als Widget nicht auswählbar, nur label. Da kann man dann auch wohl eine Pixelmap als Hintergrund laden. Ja ne, ich will Pixel setzten!
Hab dann "QImage::setPixel(int x, int y, uint index_or_rgb)" im Assistant nachgeschlagen, puh. Also, ääääh, was? Hunderte von mir nichts sagende Einstellungen, sobald es etwas konkreter wird, werden .bmp oder andere Grafikdateien geladen.

Kann mir vielleicht jemand auf die Sprünge helfen? Das kann doch nicht so schwer sein...oder

Gruß
Ralf

Verfasst: 27. Juli 2008 18:13
von Christian81
Erst ein QImage erstellen, Pixel mit setPixel() setzen und dann mit Hilfe eines QLabel anzeigen.

Verfasst: 27. Juli 2008 18:26
von Timebeast
Hm,... die Antwort analysier ich gleich nochmal genauer, bisher hab ich halt das hier:

Code: Alles auswählen

void Bild_viewer::on_pushButton_datei_open_clicked()
{
	QString fileName;
	 fileName = QFileDialog::getOpenFileName(this,
	     tr("Öffnen"),""); 
	 
	 QFile file(fileName);
	 if (file.open(QFile::ReadOnly)) {
	     char buf[10240];
	     qint64 lineLength = file.read(buf, sizeof(buf));
	     
	     int Linie;
	     int Spalte;
	     for (Linie=0;Linie<59;Linie++){
	    	 for(Spalte=0;Spalte<79;Spalte++){
	    		QImage::setPixel(Spalte, Linie); //..,uint index_or_rgb??
	    	 }
	     }
	 }
}

Verfasst: 27. Juli 2008 18:31
von Christian81
Ich würde sagen - da ist wohl erstmal ein C++-Buch angebracht.
QImage::setPixel() ist nun wirklich keine statische Funktion... ein QImage-Objekt sollte es schon sein. Und wenn Du erst ein QImage-Objekt erzeugt hast, sollte wohl auch klar sein ob was mit 'uint index_or_rgb' gemeint ist.
QImage Doku

Verfasst: 27. Juli 2008 18:49
von Timebeast
Danke für Deine Antwort.
Das QImage stand da nur als Beispiel für das was ich nicht kann, klar ist das noch gar nichts.
Also erstmal ein QImage Objekt erzeugen. Jetzt komme ich aber schon durcheinander:

Constant: QImage::Format_RGB32
Value: 4
Erklärung: The image is stored using a 32-bit RGB format (0xffRRGGBB).

So weit so gut, aber was bedeutet nun "0xffRRGGBB"?
Was soll dieses 0xff (ja, Hex255 schon klar, nur in diesem Zusammenhang nicht?)
Ist damit gemeint: 0xff(Anfang 1Byte) tja, und dann??
Vielleicht: 8Bit(R), 8Bit(R), 8Bit(G), 8Bit(G) tja, ende mit 32bit...
oder 4Byte(R), 4Byte(R) usw. das ergäbe ne krasse Größe...

Versteh ich nicht?!?

Verfasst: 27. Juli 2008 18:54
von Christian81
qRGB ist wie nahezu überall 32 Bit.
und das ff ist das Alpha-Kanal. Siehe auch http://doc.trolltech.com/4.3/qcolor.html

Verfasst: 27. Juli 2008 19:16
von Timebeast
Nö, sorry, ist es nicht, ich komme aus der uC Welt und da ist es überall nicht 32 Bit :lol:

"ff ist das Alpha-Kanal" Alpha Kanal? Ich habe 3Bit für Rot 3Bit für Grün und 2 Bit für Blau, nicht mehr und nicht weniger.

Ich kann das beliebig Umrechnen, kein Problem, von mir aus auch auf 32 Bit, aber dazu muß ich das Format verstehen. Die Site die Du verlinkt hast beschreibt sehr schön sehr komplexe Verfahren und verschiedenste Farb Modi. Ich habe aber nur.... nicht schon wieder. :?

Die initalisierung des Objektes sieht im übrigen nun so aus:

Code: Alles auswählen

QImage Bild;
Bild.QImage(80,60,4);
scheint er so auch zu nehmen.

Set Pix so:

Code: Alles auswählen

Bild.setPixel(Spalte,Linie,4);
scheint er auch so zu nehmen.

Fehlt noch die Umrechnung von 332-RGB in irgendein kryptisches 32-Bit RGB Format und das schreiben in das Label.

In das Label schreiben klappt leider noch nicht. Habs so probiert:

Code: Alles auswählen

ui.label_pixmap.pixmap(Bild);
[\code]

Wobei der erste Teil schon richtig ist, also "ui.label_pixmap" und der hintere Teil voll daneben... hmmm

Gruß
Ralf

Verfasst: 27. Juli 2008 19:20
von Christian81
Steht doch alles dort - rgb - also 0xffrrggbb - was ist da so schwer umzurechnen? Ein ganz normaler ARGB-32Bit Integer.
Ich würde außerdem das Qt-Tutorial empfehlen bevor Du hier weitermachst.

Verfasst: 27. Juli 2008 19:27
von Timebeast
Was so schwer umzurechnen ist?? Hab ich doch geschrieben:

Zur Erinnerung von vor 10Minuten:

So weit so gut, aber was bedeutet nun "0xffRRGGBB"?
Was soll dieses 0xff (ja, Hex255 schon klar, nur in diesem Zusammenhang nicht?)
Ist damit gemeint: 0xff(Anfang 1Byte) tja, und dann??
Vielleicht: 8Bit(R), 8Bit(R), 8Bit(G), 8Bit(G) tja, ende mit 32bit...
oder 4Byte(R), 4Byte(R) usw. das ergäbe ne krasse Größe...

Verfasst: 27. Juli 2008 19:47
von Christian81
Ok - es ist ein 32-Bit Integer und Standard ARGB - also 8 Byte Alpha, 8 Byte Rot, 8 Byte Grün und 8 Byte Blau - so wie jedes 32Bit - Pixel auf einem handelsüblichen PC heute aufgebaut ist. Und so wie es auch in der Qt-Doku steht (http://doc.trolltech.com/4.3/qcolor.html#QRgb-typedef)