013
06.12.2015, 11:46 Uhr
ao
(Operator)
|
Nein, Hans hat völlig recht. Nach der Schleife über resize sind alle Pixel im Vector vorhanden, und du kannst mit dem doppelten Klammer-Operator drauf zugreifen:
img[row][col].set_all (p.get_red(), p.get_green(), p.get_blue());
Oder, wenn du der pixel-Klasse noch einen operator= spendierst, dann gehts auch einfacher:
img[row][col] = p;
Dein Fehler bestand darin, dass du zuerst resize gemacht hast (Default-Pixel fürs ganze Bild anlegen) und dann noch einmal jedes Pixes mit push_back angefügt hast. img enthält danach die doppelte Menge Pixel, links ein ganz schwarzes Bild und rechts daneben nochmal das richtige. Ausgelesen hast du nur das schwarze.
Außerdem: push_back auf einem Vector ist eine sehr teure Operation, weil der bestehende Vector jedesmal umkopiert und um ein Element verlängert wird (theoretisch - praktisch optimiert die Vectorklasse das schon ein bisschen, aber es bleibt trotzdem teuer). Wenn man weiß, wie groß das Array am Ende sein soll (und bei Bilddateien weiß man das), dann sollte man wirklich resize verwenden, genau dafür ist das da.
Dringender Rat: Spiel ein bisschen mit den STL-Klassen (Vector und so) herum, damit du ein Gefühl dafür bekommst, wie die funktionieren, und achte dabei auch auf Performance. NIcht mit jedem Stück Halbwissen sofort in die Applikation gehen.
Das hier sieht mit Verlaub auch ziemlich schweinisch aus - verstehst du das in drei Wochen noch? cout << "Red: " << (int)img[(c/3)/width].at((c/3)%width).get_red() << endl; Es wäre hier viel übersichtlicher, den Row- und Column-Index extra mitzuführen. Und performanter als die ständige Dividiererei wäre es wahrscheinlich auch. Zumal du das c/3 auch noch doppelt rechnest.
Und das tellg hier ist doch auch Pamperscode für irgendwas, was sonst in die Hose geht, oder? while (Source.get(ch) && Source.tellg() <= 18+imgsize*3 )
Musst du das File zeichenweise auslesen? Hast du nicht genug RAM, um das ganze Ding auf einmal zu holen? Dieser Post wurde am 06.12.2015 um 12:02 Uhr von ao editiert. |