Метод преобразования ppm в ascii art не работает должным образом
Я написал программу для преобразования файла из формата PPM в ASCII art. Каждый пиксель входного изображения преобразуется в оттенки серого путем вычисления среднего значения красного, зеленого и синего ((красный + зеленый + синий)/3).
Обновление базовой версии состоит в том, что я вычисляю среднее значение RGB в окне размером n*n и преобразую его в символ, который уменьшит размер изображения. Таким образом, если заданное число n равно 3, окно имеет размер 3*3, что означает, что вы суммируете все девять красных, зеленых и синих значений и делите их в 3 раза n*n (3*3 в данном случае). Когда программа считает шкалу серого для первого окна, она переходит к другому и так далее до конца. Когда есть конец ширины, он прыгает вниз на количество пикселей n и читает следующую строку и т. Д.
Когда вычисляется шкала серого, она преобразуется в символ, и этот символ записывается в выходной файл для формирования художественного изображения ASCII.
Есть код, который должен сделать эту работу:
int x, y;
for (x = 0; x < width; x++){
for(y=0; y < height; y++){
array[x][y][0] = fgetc(input); //red
array[x][y][1] = fgetc(input); //green
array[x][y][2] = fgetc(input); //blue
int greyscale;
// greyscale = (red + green +blue)/3;
int blockx, blocky;
for(blockx = 0; blockx < n; blockx+=n){
for(blocky=0; blocky < n; blocky+=n){
greyscale = ((array[x][y][0] + array[x][y][1] +array[x][y][2])/(3*(n*n)));
char c = method_of_conversion(greyscale);
fprintf(output,"%c",c); // write ASCII art to the output file
}
}
}fprintf(output,"\n");
}
Выходной файл для одного ppm должен выглядеть так:
..'::....'oo&&:..
..:'#8@@oo#@@@@@@@@@8 .8&o .&o.
ooo:'.'o88' 8@@@@@@@& 8' '@@@@@@' . .&..
'@@@8&'o8&:8@@'&#:@o@# &@@@@@& &@@o .o'@8@@@@@@@@@@@@@@@@@@#o:&o
:& 8@@@@@@@@@@@@@@@@8&.&@o #@@' #8 :@@8@@o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
&@@#o8@@@@@@@@@@ '@o. :' @@@ #@@@@@@@@@@@@@@@@@@@@@@@@@@@@8:8&'
.. &@@@@@@@@#&..@@@o 'o :o.@@@@@@@@@@@@@@@@@@@@@@@@@& .@
&@@@@@@@@@@#@@@@& '8o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8
8@@@@@@@@@@@@8 & &@@@@@@@@@@#:@@@@@@@@@@@@@@@@@@@.
#@@@@@@@@@@@: 8##:&'@@'..@&&@@@@@@@@@@@@@@@@@& &
'@@@@@@@@@@. @@ '. @@@@@ @@@@@@@@@@@@@@: & :
:@@@@@@@@& 8@@@& .@@@@@@@@@@@@@@@@@@@ &.
:@@@@:.8 :@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
'@@. :@@@@@@@@@@#8@@&8''@@@@@@@@@@@:
'@&.o '.' @@@@@@@@@@@@:@@@@ .@@@''@@8o
&@&. @@@@@@@@@@@@@o@& &@ o@@ .
: :o. o@@@@@@@@@@@@@'. .@ '@. '
:@@@@. &@@#@@@@@@@@@@ . : . o
o@@@@@@ @@@@@@@@. .# '@
@@@@@@@@o @@@@@@@ 8oo@o .8&'
@@@@@@@@@@. .@@@@@# :&. '@8
.@@@@@@@@8 @@@@@@ : '
o@@@@@@@' .@@@@@@ 8 :#@o8'
&@@@@@@ @@@@@ .@ .&@@@@@@
8@@@@& @@@@8 .o @@@@@@@@@
@@@@@ .@@@ o@@@@@@@@
@@@@ @8 '@o #@@8
:@@# o& .o
:@# : .:
8@. '
o#
'
.' .. ...... . ..
8@ ..:'.o#&@@@@@@:o@@@@@@@@@@@@@@@@@#o.
':8888&&@@@@8@@@@' 8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Но моя программа выводит это так:
..'::....'oo&&:..
..:'#8@@oo#@@@@@@@@@8
.8&o .&o.
ooo:'.'o88' 8@@@@@@@&
8' '@@@@@@' . .&..
'@@@8&'o8&:8@@'&#:@o@# &@@@@@&
&@@o .o'@8@@@@@@@@@@@@@@@@@@#o:&o
:& 8@@@@@@@@@@@@@@@@8&.&@o #@@' #8
:@@8@@o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
&@@#o8@@@@@@@@@@ '@o. :'
@@@ #@@@@@@@@@@@@@@@@@@@@@@@@@@@@8:8&'
.. &@@@@@@@@#&..@@@o 'o
:o.@@@@@@@@@@@@@@@@@@@@@@@@@& .@
&@@@@@@@@@@#@@@@& '8
o@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8
8@@@@@@@@@@@@8 & &
@@@@@@@@@@#:@@@@@@@@@@@@@@@@@@@.
#@@@@@@@@@@@: 8#
#:&'@@'..@&&@@@@@@@@@@@@@@@@@& &
'@@@@@@@@@@. @@
'. @@@@@ @@@@@@@@@@@@@@: & :
:@@@@@@@@& 8@
@@& .@@@@@@@@@@@@@@@@@@@ &.
:@@@@:.8 :@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@
'@@. :@@@
@@@@@@@#8@@&8''@@@@@@@@@@@:
'@&.o '.' @@@@
@@@@@@@@:@@@@ .@@@''@@8o
&@&. @@@@
@@@@@@@@@o@& &@ o@@ .
: :o. o@@@
@@@@@@@@@@'. .@ '@. '
:@@@@. &@@
#@@@@@@@@@@ . : . o
o@@@@@@
@@@@@@@@. .# '@
@@@@@@@@o
@@@@@@@ 8oo@o .8&'
@@@@@@@@@@.
.@@@@@# :&. '@8
.@@@@@@@@8
@@@@@@ : '
o@@@@@@@'
.@@@@@@ 8 :#@o8'
&@@@@@@
@@@@@ .@ .&@@@@@@
8@@@@&
@@@@8 .o @@@@@@@@@
@@@@@
.@@@ o@@@@@@@@
@@@@
@8 '@o #@@8
:@@#
o& .o
:@#
: .:
8@.
'
o#
'
.'
.. ...... . ..
8@
..:'.o#&@@@@@@:o@@@@@@@@@@@@@@@@@#o.
':8888&&@@@@8@@@@' 8@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Может кто-нибудь сказать мне, что я делаю не так?
1 ответ
Я скопировал ваш вывод в текстовый редактор. Я обнаружил, что после колонки 40 был вставлен возврат каретки / перевод строки. Удаление его выявило ваше первоначальное изображение. Я не могу объяснить этот перевод строки. Мне кажется забавным, что ваш внешний цикл повторяется по ширине, а ваш внутренний цикл по высоте. Я бы ожидал, что наоборот, печатая одну горизонтальную линию для каждой y-линии.