2016-04-11 2 views
0

Добрый день всем. Во-первых, я хотел бы извиниться за мой код - я настоящий новичок в C. Моя проблема в том, что - мне дан ppm-файл, и мне нужно будет хранить значения оттуда в массив. Я уже сохранил высоту, ширину и максимальное значение цвета, теперь моя идея сохранить значения будет такой, как показано на картинке, умножая на три, потому что она находится в формате R G B. спасибо за вашу помощь и, пожалуйста, рассмотривать тот факт, я настоящий новичок в C.изображение свертки из файла ppm

my code and output

#include <stdio.h> 
int main(int argc, char** argv) { 
int i = 0; 
int j = 0; 
FILE *fp; 
fp = fopen(argv[1], "r"); 
printf(" %s ", argv[1]); 
printf("\n"); 
int firstLine[2]; 
int width; 
int next; 
int enter; 
int loop; 
int height; 
int max_color; 
int pix[width][height]; 
int mask[3][3] = {// inicializting our given mask 
    {0, -1, 0}, 
    {-1, 5, -1}, 
    {0, -1, 0} 
}; 

for (i = 0; i < 3; i++) { 
    for (j = 0; j < 3; j++) { 
     printf("%d ", mask[i][j]); 

    } 
    printf("\n"); 
} 

fscanf(fp, "%s", &firstLine); 
fscanf(fp, "%d", &height); 
fscanf(fp, "%d", &width); 
fscanf(fp, "%d", &max_color); 


printf("%p", firstLine); 
printf("\n"); 
printf("%d ", width); 
printf("\n"); 
printf("%d", height); 
printf("\n"); 
printf("%d", max_color); 
printf("\n"); 


for (i = 0; i < width * 3; i++) { 
    for (j = 0; j < height * 3; j++) { 
     loop = fscanf(fp, "%d", &enter); 
     pix[i][j] = enter; 
     printf("%d ", enter); 
    } 
} 

// fclose(fp); 


return (EXIT_SUCCESS); 

}

+0

, пожалуйста, не используйте изображения для обмена кодом! :) скопируйте и вставьте его сюда или пастебин. – fluter

+0

Извините, я новичок здесь, поэтому я сделал прямо сейчас. Спасибо – user118331

+0

Не уверен, что вам сказали взять 8-битные образцы R, G и B, но технически вы должны проверить, что значение «MAX_INTENSITY» равно 255, прежде чем предположить, что, если оно превышает 255 (скорее всего, равно 65535) вы должны читать 16-битные образцы. –

ответ

1

Вы не можете определить массив с неизвестного размера, особ по высоте и ширине не инициализируется. Вы должны использовать динамически назначаемый массив здесь, как это:

int ***pix; 
pix = malloc(height * sizeof(int**)); 
for (i = 0; i < height; i++) { 
    pix[i] = malloc(width * sizeof(int**)); 
    for (j = 0; j < width; j++) { 
     pix[i][j] = malloc(3 * sizeof(int)); 
    } 
} 

Чтобы исправить разобрать двоичный код, вы не можете использовать форматированный ввод, так как они предназначены для строк. Вместо этого вы можете использовать fread. читать ширина:

fread(&width, sizeof(int), 1, fp); 

Затем, чтобы заполнить этот массив:

for (i = 0; i < height; i++) { 
    for (j = 0; j < width; j++) { 
     for (k = 0; k < 3; k++) { 
      fread(&enter, sizeof(int), 1, fp); 
      pix[i][j][k] = enter; 
     } 
    } 
} 

Это работает только если то, что вы сказали о формате файла частей на миллион правильно, конечно.

+0

Привет, большое спасибо за ваш ответ, я действительно ценю это. Несчастливо он не работает хорошо - давая мне 21755842 для всех блоков в массиве. Нам был предоставлен входной файл ppm в формате переносимого pixmap формата с двоичным кодированием. Этот вид формата всегда: P6, ширина, высота, а затем постоянная - максимальное значение интенсивности пикселя , а затем данные - части RGB для каждого пикселя. Каждая часть пикселя/RGB представляет собой один байт. – user118331

+0

Файл находится в двоичном формате, поэтому отформатированный вход не будет работать! – fluter

+0

@fluter Заголовок на самом деле находится в ASCII, затем данные следуют в двоичном формате. –

Смежные вопросы