我编写了一个程序,用于将文件从PPM格式转换为ASCII艺术。通过计算红绿色和蓝色值的平均值((红色+绿色+蓝色)/ 3),输入图像的每个像素都转换为灰度。
基本版本的升级是我在大小为n * n的窗口中计算RGB的平均值,并将其转换为可减小图像大小的字符。因此,如果给定数字n为3,则窗口大小为3 * 3,这意味着您将所有九个红色,绿色和蓝色值相加并将其除以n * n的3倍(在这种情况下为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.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
谁能告诉我我做错了什么?
答案 0 :(得分:1)
我已将您的输出复制到文本编辑器。我发现在第40列之后插入了回车/换行。删除它显示您的原始图像。我无法解释这个换行。我觉得很有趣,但你的外循环遍历宽度,你的内循环遍及高度。我希望相反,为每个y线打印一条水平线。