2015-04-06 3 views
0

Я пришел к вам все раньше с проблемой, которая была просто ошибкой, поэтому я надеюсь, что глаза будут выглядеть одинаково.Перелистывание изображения PPM в C

Это в C

Я должен перевернуть изображение РРМ по горизонтали, но мой текущий код либо рисует Сегментация Fault или на самом деле не переворачивать ничего.

код я использую, который рисует Сегментация Fault является:

int a, b, x, y; 
x = 3 * myPic->rows; 
y = 3 * myPic->cols; 
for(a = 0; a < (y/2); a++) { 
    for(b = 0; b < x; b++) { 
     Pixel temp = myPic->pixels[a][b]; 
     myPic->pixels[a][b] = myPic->pixels[y - a - 1][b]; 
     myPic->pixels[y - a - 1][b] = temp; 
    } 
} 
return myPic; 

}

Код, который не возвращает изменения:

int a, b, x, y; 
for(a = 0; a < myPic->rows; a++) { 
    for(b = 0; b < myPic->cols; b++) { 
     Pixel temp = myPic->pixels[a][b]; 
     myPic->pixels[a][b] = myPic->pixels[myPic->cols - a - 1][b]; 
     myPic->pixels[myPic->cols - a - 1][b] = temp; 
    } 
} 
return myPic; 

Поскольку ПМП изображения имеют значения RGB, я предположим, что значения строк и столбцов следует умножить на три. И я подумал, что, пройдя весь путь, вы вернетесь к оригиналу, поэтому я разделил ширину (столбцы) на два. Я застрял, и я надеюсь, что это небольшая ошибка, может ли кто-нибудь помочь?

+0

вы бежите от конца изображения. 'myPic-> pixels [a] [b]' идет стрелой, потому что 'a' и' b' устанавливаются в три раза в размере изображения. вы не можете просто начать доступ к индексам массивов, которые не существуют. –

+0

Хорошо, спасибо, что имеет смысл ... Должен ли я перераспределять myPic-> pixels [a] [b] в три раза больше? Как я могу это сделать? – yup

ответ

1

Ваш первый код плохой, он обращается к массиву из его границ. Второй код лучше, хотя он переворачивает изображение, после чего он повторяет его.

И только прямые вещи, количество строк - высота изображения, количество столбцов - ширина изображения, первый индекс в 2-х массивах - выбор строки (индекс высоты), а второй индекс - выбор колонок (индекс ширины). Горизонтальные отражающие пиксели слева направо. Вертикальный флип-обмен пиксели сверху вниз.

Имея, что это должно быть горизонтальной флип

int row, col; 
for(row = 0; row < myPic->rows; row++) { 
    for(col = 0; col < myPic->cols/2 ; col++) { /*notice the division with 2*/ 
     Pixel temp = myPic->pixels[row][col]; 
     myPic->pixels[row][col] = myPic->pixels[row][myPic->cols - col -1]; 
     myPic->pixels[row][myPic->cols - col -1] = temp; 
    } 
} 
return myPic; 

После изменения изображения в памяти, необходимо сохранить его, или перерисовывать измененное изображение с графической библиотекой, которую вы используете.

+0

Хорошо, я понимаю, как я прошел мимо границ, но я попробовал код, который вы использовали, и он возвращает то же изображение, что и раньше. – yup

+0

См. Отредактированный ответ. – dimm

+0

Это приводит к перевернутому, но очень пятнистому изображению ... некоторые части изображения кажутся каждой другой линией фиксированной – yup

Смежные вопросы