Преобразование градаций серого в ascii и запись его в файл .txt - PullRequest
1 голос
/ 22 октября 2019

Это мой код. lenaArray.h - это файл с оттенками серого. У меня проблема в том, что он не пишет в файл, и я не получаю никаких ошибок.

include stdio.h

include stdlib.h

include stdint.h

include "lenaArray.h" 


// Average grayscale big

int avgGrayScale(int *lena){

   int sum = 0;

   for (int x = 0; x < 512; x++){

  for (int y = 0; y< 512 ; y++){

     sum += lena[y * 512 + x]; 

  }



}

   return sum / (512 * 512);

}

// Average grayscale small

int avgGrayScaleSmall(int *lena){

   int sum = 0;

   for (int x = 100; x < 400; x++){

      for (int y = 100; y< 400 ; y++){

         sum += lena[y * 400 + x]; 

      }

   }

   return sum / (300 * 300);

}

// Ascii character

char characterGrayScale(int grayScale) {

    if (grayScale < 25) return '@';
    if (grayScale < 50) return '%';
    if (grayScale < 75) return '#';
    if (grayScale < 100) return '*';
    if (grayScale < 125) return '+';
    if (grayScale < 150) return '=';
    if (grayScale < 175) return '-';
    if (grayScale < 200) return ':';
    if (grayScale < 225) return '.';
    return ' ';
}


int main (void) {

// print average grayscale big picture

int averageBigLena = avgGrayScale(&lena);

  printf("Average grayscale big image: %d\n", averageBigLena);

// print average grayscale small picture

int averageSmallLena = avgGrayScaleSmall(&lena);

  printf("Average grayscale small image: %d\n", averageSmallLena);

  // Print lena in ascii to a file

    FILE *lenaAsciiBig;

    lenaAsciiBig = fopen("lena_ascii_big.txt", "w");

    for (int x = 0; x < 512; x++) {

        for (int y = 0; y < 512; y++) {

            char c = characterGrayScale(lena[y * 512 + x]);

            fwrite(&c, 1, 1, lenaAsciiBig);

        }

        char c = '\n';

        fwrite(&c, 1, 1, lenaAsciiBig);

    }

    fclose(lenaAsciiBig);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

компиляция размещенного кода приводит к:

gcc    -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11  -c "untitled.c"  (in directory: /home/richard/Documents/forum)
untitled.c:1:1: error: unknown type name ‘include’
 include stdio.h
 ^~~~~~~
untitled.c:1:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
 include stdio.h
              ^
untitled.c: In function ‘main’:
untitled.c:73:22: warning: implicit declaration of function ‘avgGrayScale’; did you mean ‘avgGrayScaleSmall’? [-Wimplicit-function-declaration]
 int averageBigLena = avgGrayScale(&lena);
                      ^~~~~~~~~~~~
                      avgGrayScaleSmall
untitled.c:73:36: error: ‘lena’ undeclared (first use in this function)
 int averageBigLena = avgGrayScale(&lena);
                                    ^~~~
untitled.c:73:36: note: each undeclared identifier is reported only once for each function it appears in
untitled.c:75:3: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
   printf("Average grayscale big image: %d\n", averageBigLena);
   ^~~~~~
untitled.c:75:3: warning: incompatible implicit declaration of built-in function ‘printf’
untitled.c:75:3: note: include ‘<stdio.h>’ or provide a declaration of ‘printf’
untitled.c:85:5: error: unknown type name ‘FILE’
     FILE *lenaAsciiBig;
     ^~~~
untitled.c:87:20: warning: implicit declaration of function ‘fopen’ [-Wimplicit-function-declaration]
     lenaAsciiBig = fopen("lena_ascii_big.txt", "w");
                    ^~~~~
untitled.c:87:18: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
     lenaAsciiBig = fopen("lena_ascii_big.txt", "w");
                  ^
untitled.c:95:13: warning: implicit declaration of function ‘fwrite’ [-Wimplicit-function-declaration]
             fwrite(&c, 1, 1, lenaAsciiBig);
             ^~~~~~
untitled.c:95:13: warning: incompatible implicit declaration of built-in function ‘fwrite’
untitled.c:95:13: note: include ‘<stdio.h>’ or provide a declaration of ‘fwrite’
untitled.c:101:9: warning: incompatible implicit declaration of built-in function ‘fwrite’
         fwrite(&c, 1, 1, lenaAsciiBig);
         ^~~~~~
untitled.c:101:9: note: include ‘<stdio.h>’ or provide a declaration of ‘fwrite’
untitled.c:105:5: warning: implicit declaration of function ‘fclose’ [-Wimplicit-function-declaration]
     fclose(lenaAsciiBig);
     ^~~~~~
Compilation failed.

Давайте начнем с include операторы должны иметь начальный символ #.

Во-вторых, имена файлов заголовка системы должныбыть окруженным < и >

IE

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

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

0 голосов
/ 22 октября 2019

Я получил код, работающий с двумя модификациями. Сначала я заменил #include "lenaArray.h" определением простого пустого массива. Затем я изменил вызов avgGrayScale(&lena); на avgGrayScale(lena); и адаптировал маленькую версию. Наконец, я получаю текстовый файл с 256 строками по 256 @ из-за моего пустого массива lena.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

//include "lenaArray.h"
int lena[512*512]; //Dirty HACK, becaus I dont have lena data

// Average grayscale big

int avgGrayScale(int *lena)
{
    int sum = 0;
    for (int x = 0; x < 512; x++)
    {
        for (int y = 0; y< 512 ; y++)
        {
            sum += lena[y * 512 + x];
        }
    }
    return sum / (512 * 512);
}

// Average grayscale small

int avgGrayScaleSmall(int *lena)
{
    int sum = 0;
    for (int x = 100; x < 400; x++)
    {
        for (int y = 100; y< 400 ; y++)
        {
            sum += lena[y * 400 + x];
        }
    }
    return sum / (300 * 300);
}

// Ascii character

char characterGrayScale(int grayScale)
{
    if (grayScale < 25) return '@';
    if (grayScale < 50) return '%';
    if (grayScale < 75) return '#';
    if (grayScale < 100) return '*';
    if (grayScale < 125) return '+';
    if (grayScale < 150) return '=';
    if (grayScale < 175) return '-';
    if (grayScale < 200) return ':';
    if (grayScale < 225) return '.';
    return ' ';
}


int main (void)
{
// print average grayscale big picture

    int averageBigLena = avgGrayScale(lena); 
    printf("Average grayscale big image: %d\n", averageBigLena);

// print average grayscale small picture
    int averageSmallLena = avgGrayScaleSmall(lena);
    printf("Average grayscale small image: %d\n", averageSmallLena);

    // Print lena in ascii to a file

    FILE *lenaAsciiBig;

    lenaAsciiBig = fopen("lena_ascii_big.txt", "w");

    for (int x = 0; x < 512; x++)
    {
        for (int y = 0; y < 512; y++)
        {
            char c = characterGrayScale(lena[y * 512 + x]);
            fwrite(&c, 1, 1, lenaAsciiBig);
        }
        char c = '\n';
        fwrite(&c, 1, 1, lenaAsciiBig);
    }
    fclose(lenaAsciiBig);
    return 0;
}

Вот результат (ls = список файлов в каталоге; ./SO = выполнение программы; head = показывать первые строки):

ME@LAPTOP:~/CodeProjects/SO/bin/Debug$ ls 
SO
ME@LAPTOP:~/CodeProjects/SO/bin/Debug$ ./SO 
Average grayscale big image: 0 
Average grayscale small image: 0
ME@LAPTOP:~/CodeProjects/SO/bin/Debug$ ls 
lena_ascii_big.txt  SO
ME@LAPTOP:~/CodeProjects/SO/bin/Debug$ head -n3 lena_ascii_big.txt 
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...