2015-04-30 3 views
0

Я пытаюсь написать программу для размытия изображения, но сначала пытаюсь увидеть, могу ли я даже воспроизвести изображение, пиксель за пикселем, в другом файле. Я выделил 2-мерный массив char, чтобы сохранить значение каждого пикселя в изображении.Воспроизведение изображения с помощью C

Примечание: Изображение в оттенках серого, и это типа .raw

Однако всякий раз, когда я пытаюсь читать пиксели в мой 2D массив, мое аварийное завершение работы программы. Я чувствую, что это связано с тем, что я не зацикливаюсь в размерах изображения правильно, но я не уверен.

Код:

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

int main() 
{ 
    FILE *fin, *fout; 
    char path_in[64], path_out[64], **rev, px; 
    int width, height, read, i, j; 

    printf("Input file name: "); 
    scanf("%s", path_in); 
    printf("Output file name: "); 
    scanf("%s", path_out); 

    printf("Width of image (in pixels): "); 
    scanf("%d", &width); 
    printf("Height of image (in pixels): "); 
    scanf("%d", &height); 

    fin = fopen(path_in, "rb"); 
    fout = fopen(path_out, "wb"); 

    row = 0; 
    rev = (char **)malloc(height * sizeof(char)); 
    for(i = 0; i < width; i++) 
     rev[i] = (char *)malloc(width * sizeof(char)); 

    for(i = 0; i < height; i++) 
    { 
     for(j = 0; j < width; j++) 
     { 
      read = fread(&px, sizeof(char), 1, fin); 
      rev[i][j] = px; 
     } 
    } 

    fclose(fout); 
    fclose(fin); 

    return 0; 
} 

Моя программа довольно узок, так как она принимает только оттенки серого .raw тип изображения.

+2

Почему вы используете (символ *) ? SW быстрее, если вы используете массив char (char *), выделенный с размером (width * height) * sizeof (char), а затем вы указываете внутри такого массива с помощью массива [x * height + y] или массива [y * width + x] (только один из двух!) –

ответ

2

Эта линия: rev = (char **)malloc(height * sizeof(char));

должен быть rev = (char **)malloc(height * sizeof(char*));

+0

В чем разница между 'char' и' char * '? – Delfino

+0

'char' - это один символ (1 байт),' char * '- указатель на символ (4 или 8 байтов в зависимости от вашего компьютера). – Buddy

3

Изменить эти линии, как это:

row = 0; 
rev = malloc(height * sizeof *rev); 
for(i = 0; i < width; i++) 
    rev[i] = malloc(width * sizeof **rev); 

Вы были выделения памяти для height символов, а не для height указателей символов, как вы хотели ,

Кроме того, не отбрасывают результат malloc при разработке с C

+1

Что случилось с литьем 'malloc'? Извините, я новичок в C. – Delfino

+0

@ Delfino Читайте это: http://stackoverflow.com/q/605845/1679849 –

0

Я думаю, что лучше использовать непрерывную память для управления изображением!

Использование char ** таким образом, как в вашем коде, у вас нет блока памяти, который содержит все изображение, но много непересекающихся векторов, каждый из которых содержит строку!

Следующий код считывает изображение в непрерывном блоке памяти, используя только один таНос:

char * rev; 

/* HERE your code to insert width and height */ 

rev = malloc(height * width *sizeof(char)); 
if (rev==NULL) { 
    /* Ops! The buffer is not allocated!!! */ 
} 

/* HERE you open the file and so on */ 

for(i = 0; i < height; i++) 
{ 
    for(j = 0; j < width; j++) 
    { 
     read = fread(&rev[i*width+j], sizeof(char), 1, fin); 
     if (read!=1) { /* 1 is the number of bytes fread reads if ok */ 
      /* Ops, there's a problem! The fread didn't read! */ 
     } 
    } 
} 

Используя символ * вы можете загрузить все изображения с одной FREAD, избегая таким образом два для петель :)

fread(rev,witdh,height,fin); 

Таким образом, вы можете указать отдельные пиксели с помощью:

rev[y*width+x]; 
Смежные вопросы