extrahieren Das Problem ist ziemlich einfach. (Ich bin verwirrt, warum die Suche nichts gefunden)Howto elegant eine 2D-Rechteck-Region aus einem C++ - Vektor
ich ein rechteckiges „Bild“, die es Pixelfarbe Linie nach Zeile in einem std :: vector
ich kopieren mag einen rechteckiges speichern Region aus diesem Bild heraus.
Wie würde ich das elegant in C++ programmieren?
Mein erster Versuch:
template <class T> std::vector<T> copyRectFromVector(const std::vector<T>& vec, std::size_t startx, std::size_t starty, std::size_t endx, std::size_t endy, std::size_t fieldWidth, std::size_t fieldHeight)
{
using namespace std;
vector<T> ret((endx-startx)*(endy-starty)+10); // 10: chickenfactor
// checks if the given parameters make sense:
if (vec.size() < fieldWidth*endy)
{
cerr << "Error: CopyRectFromVector: vector to small to contain rectangular region!" << std::endl;
return ret;
}
// do the copying line by line:
vector<T>::const_iterator vecIt = vec.begin();
vector<T>::forward_iterator retIt = ret.end();
vecIt += startx + (starty*fieldWidth);
for(int i=starty; i < endy; ++i)
{
std::copy(vecIt, vecIt + endx - startx, retIt);
}
return ret;
}
nicht einmal kompilieren .....
Addit: Klarstellung: Ich weiß, wie diese "von Hand" zu tun. Es ist kein Problem als solches. Aber ich würde gerne einige C++ stl Iterator Magie, die das gleiche tut, aber schneller und ... mehr C++ stilvoll.
Zusatz: Ich gebe dem Algorithmus den imageDataVector, die Breite und Höhe des Bildes und ein Rechteck, das die Region angibt, die ich aus dem Bild kopieren möchte. Der Rückgabewert sollte ein neuer Vektor mit dem Inhalt des Rechtecks sein.
Betrachten Sie es als Öffnen Sie Ihre Lieblings-Bildbearbeitung, und kopieren Sie eine rechteckige Region daraus. Das Bild wird als langes 1D-Array (Vektor) von Pixelfarben gespeichert.
Neil Sie sind ein Lebensretter :) Schreiben Sie einen Kommentar, so dass ich Ihnen ein :) – AndreasT
Klärung +1 kann: Neil my (crappy) Beispielcode nur gerettet :) Immer noch nicht sicher, was ich falsch gemacht haben ... aber was zur Hölle ... – AndreasT
Sie haben versucht, HTML zu verwenden - tun Sie das nicht. Wählen Sie stattdessen den gesamten Code mit der Maus aus, und geben Sie Strg-K ein. –