将 ppm 转换为 ascii 艺术的方法无法正常工作
A method to convert ppm to ascii art doesn't work properly
我编写了一个将文件从 PPM 格式转换为 ASCII 艺术的程序。通过计算红绿蓝值的平均值 ((red + green +blue)/3),将输入图像的每个像素转换为灰度。
基础版的升级是我计算了一个window大小为n*n的RGB的平均值,并将其转换为一个字符,从而减小了图像的大小。因此,如果给定数字 n 为 3,则 window 的大小为 3*3,这意味着您将所有九个红色、绿色和蓝色值相加并将其除以 3 次 n*n(本例中为 3*3案件)。当程序计算第一个 window 的灰度时,它会移动到另一个,依此类推,直到结束。当有width结束时,它跳下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");
}
1 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.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
谁能告诉我我做错了什么?
我已将您的输出复制到文本编辑器中。我发现在第40列之后插入了一个回车return/linefeed。删除它会显示您的原始图像。我无法解释这个换行符。我觉得很有趣,尽管你的外循环遍历宽度而你的内循环遍历高度。我希望反过来,为每条 y 线打印一条水平线。
我编写了一个将文件从 PPM 格式转换为 ASCII 艺术的程序。通过计算红绿蓝值的平均值 ((red + green +blue)/3),将输入图像的每个像素转换为灰度。
基础版的升级是我计算了一个window大小为n*n的RGB的平均值,并将其转换为一个字符,从而减小了图像的大小。因此,如果给定数字 n 为 3,则 window 的大小为 3*3,这意味着您将所有九个红色、绿色和蓝色值相加并将其除以 3 次 n*n(本例中为 3*3案件)。当程序计算第一个 window 的灰度时,它会移动到另一个,依此类推,直到结束。当有width结束时,它跳下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");
}
1 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.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
谁能告诉我我做错了什么?
我已将您的输出复制到文本编辑器中。我发现在第40列之后插入了一个回车return/linefeed。删除它会显示您的原始图像。我无法解释这个换行符。我觉得很有趣,尽管你的外循环遍历宽度而你的内循环遍历高度。我希望反过来,为每条 y 线打印一条水平线。