2015-04-06 2 views
0

Я пишу в C, и мне нужно написать код, который будет инвертировать значения RGB для каждого пикселя в изображении. Это простой процесс, когда вы принимаете максимальное значение цвета и вычитаете фактические значения RGB. Я успешно прочитал максимальное значение цвета, но при попытке инвертировать значения все возвращается как 0 и при записи в новый файл не читается. Ниже приведен код, какие-нибудь идеи?Инвертирование значений изображения PPM

Инверсия картину

int i,j; 
for(i=0; i<myPic->rows;++i) { 
    //Moves up and down the columns reaching all Pixels 
    //Moves across left to right across all columns 
    for (j=0;j<myPic->cols;++j) { 
    //Inverstion requires the actual value to be subtracted from the max 
     myPic->pixels[i][j].red = myPic->colors - myPic->pixels[i][j].red; 
     myPic->pixels[i][j].green = myPic->colors - myPic->pixels[i][j].green; 
     myPic->pixels[i][j].blue = myPic->colors - myPic->pixels[i][j].blue; 
     } 
    } 
return myPic; 

}

Вывод изображения

fprintf(name,"P3\n%d %d\n%d\n",myPic->rows,myPic->cols,myPic->colors); 
//The P3,rows,columns,and color values are all printed first 
int i,j; 
for(i=0; i< myPic->rows;++i) { 
     for(j=0; j<myPic->cols;++j) { //Each Pixel is printed one at a time 
     fprintf(name,"%d",myPic->pixels[i][j].red); //Red printed first 
     fprintf(name,"%d",myPic->pixels[i][j].green); //Green printed second 
     fprintf(name,"%d",myPic->pixels[i][j].blue); //Blue printed third 
     fprintf("\n"); 
     } 
    } 

}

Спасибо за помощь, ребята, это то, что я использую в настоящее время и он работает

ответ

2

При записи пиксельных данных, эта линия

myPic->pixels[i] = malloc(sizeof(Pixel) *myPic->cols); 

перезаписывает существующий указатель, и делает это указывает на новые (и что более важно, неинициализированным) данных.

Копирование вставки (которое вы, кажется, делали) может работать иногда, но вы должны позаботиться о том, чтобы правильно изменить скопированный код.


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

+0

Я понимаю, что вы имеете в виду сейчас. Я просто воспользовался функцией чтения вначале и переместил ее вниз, слегка изменив ее, поэтому я понимаю, почему переписывание - это не то, что я хотел – yup

0

@Joachim является правильным. поэтому сделайте что-нибудь вроде этого:

int i,j; 
for(i=0; i<myPic->rows;++i) { 

    Pixel[myPic->cols] temp = *myPic->pixels[i]; 

    //Moves up and down the columns reaching all Pixels 
    myPic->pixels[i] = malloc(sizeof(Pixel) *myPic->cols); 
    //Moves across left to right across all columns 
    for (j=0;j<myPic->cols;++j) { 
    //Inverstion requires the actual value to be subtracted from the max 
     myPic->pixels[i][j].red = myPic->colors - temp[j].red; 
     myPic->pixels[i][j].green = myPic->colors - temp[j].green; 
     myPic->pixels[i][j].blue = myPic->colors - temp[j].blue; 
     } 
    } 
    return myPic; 
} 
Смежные вопросы