2015-12-31 10 views
2

У меня есть чертеж внутри fbo, и вы пытаетесь уменьшить размер fbo, обрезая видимые части с помощью ограничительной рамки. Вот визуальное представление того, что я пытаюсь достичь: bounding box exampleОбрезка Fbo в ограничительную рамку в Openframeworks

Я нашел решение: передать fbo данных в pixels, а затем обнаружить первые цветные пиксели слева, справа, сверху, нижняя часть изображения.

В следующей части кода я пытаюсь обнаружить нижнее пересечение. Но у меня странная проблема с пикселями.

int w = 4; 
int h = 4; 

fbo.allocate(w, h, GL_RGBA); 
fbo.begin(); 
ofClear(0, 0); 
fbo.end(); 

fbo.begin(); 
ofSetColor(255, 0, 0); 
ofDrawRectangle(0, 0, 4, 2); 
fbo.end(); 

pixels.allocate(w, h, GL_RGBA); 

fbo.readToPixels(pixels); 

for(auto line = pixels.getLines().end(); line != pixels.getLines().begin(); --line){ 
    for(auto pixel: line.getPixels()){ 
     cout << "line: " << line.getLineNum() << " color: " << pixel.getColor() << endl; 
    } 
} 

выход:

line: 4 color: 24, 215, 83, 118 
line: 4 color: 255, 127, 0, 0 
line: 4 color: 173, 7, 0, 0 
line: 4 color: 1, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 3 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 2 color: 0, 0, 0, 0 
line: 1 color: 255, 0, 0, 255 
line: 1 color: 255, 0, 0, 255 
line: 1 color: 255, 0, 0, 255 
line: 1 color: 255, 0, 0, 255 

line:1 выглядит хорошо, но то, что случилось с line:4, что это случайные цвета там делает? После восстановления приложения они, возможно, ушли, но со случайным шансом. Может быть, есть другой способ обрезать fbo видимыми частями изображения? Этот solution не подходит для меня.

ответ

0

Ваш цикл является проблемой. Строка 4 указывает на не инициализированную область памяти, в то время как линия 0 отсутствует. Ваш прямоугольник рисуется в строке 0 и линии 1.

Из итератора :: конца() документация:

Вернуться итератор конца Возвращает итератор со ссылкой на пришедшую к торцевому элементу в векторный контейнер.

Прошедший элемент - это теоретический элемент, который будет следовать за последним элементом вектора. Он не указывает на какой-либо элемент и, следовательно, не должен быть разыменован.

вопрос с ответами, которые помогут вам: Iterating C++ vector from the end to the begin

+0

Это имеет смысл. Спасибо! – Gordey