将ppm转换为ASCII艺术的程序无法正常工作

时间:2015-05-22 18:42:54

标签: c rgb grayscale ascii-art

我正在编写一个程序,用于将文件从PPM格式转换为ASCII艺术。通过计算红绿蓝值((red + green +blue)/3)的平均值,将输入图像的每个像素转换为灰度。

基本版本的升级是我在大小为n*n的窗口中计算RGB的平均值,并将其转换为可减小图像大小的字符。因此,如果给定的数字n3,则窗口大小为3*3,这意味着您将所有九个红色,绿色和蓝色值相加并将其除以3 {{1} (在这种情况下为n*n)。当程序计算第一个窗口的灰度时,它会移动到另一个窗口,依此类推,直到结束。当宽度结束时,它会向下跳过n个像素并读取下一行等。

计算灰度时,会将其转换为字符,并将此字符写入输出文件以形成ASCII艺术图像。

我的程序确实编译了,但是当我测试它时,我得到了错误的图像。一个非常简单的图像转换为空白文件,另一个应该看起来像棋盘,但它打印了一个非常大的列图像。通过扫描像素块1 * 1将这两个图像转换为ASCII艺术。第三个图像非常大,所以它应该被3 * 3块转换,但是我得到的输出文件太大而无法打开。在简单的文本编辑器中。

谁能告诉我哪里犯了错误?

以下是代码:

3*3

1 个答案:

答案 0 :(得分:1)

这些行:

       for(i = 0; i < width; i+=n){
            for(j=0; j < height; j+=n){

可能不正确。如果是n = 3,则会在图像的X和Y上读取每3个像素而不是本地块。这将为您提供分散的数据集而不是块。

或者......在此代码中放置第二组for循环,从0n-1计算并读取要平均的所有像素。这实际上可能是这里缺少的一部分。

       for(i = 0; i < width; i+=n){
            for(j=0; j < height; j+=n){

               for(blockx = 0; blockx  < n; blockx++){
                    for(blocky=0; blocky < n; blocky++){
                        // Use current averaging code to gather all numbers, 
                        // being careful of overflow.