2017-02-17 4 views
1

Р6формат изображения Чтение PPM

Р6 указывает на то, что это изображение ЦБК. Следующие два поля - это ширина и высота изображения. Последнее поле дает максимальное значение пикселя. В конце заголовка находится \ n, а затем данные двоичного пикселя. Изображение в цвете, поэтому есть три байта (красный, зеленый, синий). Цель моей функции readPPM - вернуть данные пикселя в одномерный массив без знака, а также ширину и высоту изображения. Цель моей функции writePPM (я еще ничего не сделал для этой функции) - записать изображение формата PPM в пустой файл из данной информации, возвращенной из моей функции readPPM. Я все еще не уверен, как сделать эту программу, поэтому я не хранил 650 в ширину и 652 в высоту. Я буду беспокоиться об этом, когда смогу читать и писать текстовые файлы.

Обновление: Я успешно сохранил заголовок (P6, 650, 652 и 255)) в своих правых переменных (я знаю, потому что я попробовал распечатать их значения, и они вышли правильно). Мой вывод показан ниже. Мне было интересно, что это за бесхитростные персонажи ниже максимума. Являются ли эти данные двоичными пикселями? Если это так, тогда мне просто нужно написать мою функцию writePPM.

Выход: Psix: Р6

Ширина: 650

Высота: 652

максимум:????? 255

ɡ Ƞ ɢ ˤ ɢ с? G? Ǡ? ʤ? ɣ? ɡ? ɡ? ǟ? словар? С? ƞ? ȡ? ʣ? ʣ? ȡ? С? С? Ȟ? ʠ? ̤? ƞ грешных ʤ? ʦ? ʦ? ɧ? ƥ? ǥ? Ȧ? ɩ? ʪ? ʫ? ʫ? ʪ? ʨ? ɤ? Ǡ? ʢ? ̤? ȡ? ȡ? ʥ? ɥ? ʧ? Ģ? ǥ? ƥ? Ģ? ???? ???? ƥ ǥ? ʨ? ɧ? ʨ? ɧ? ɧ? ͨ? Ϧ? ʟ? ˠ? Х? Φ? ͥ? ˣ? Ǟ ?? ò? ʦ? Ɥ? ??? г ?????????? ????? ħ? ˙U ??????? ©? Ǯ ????????????? ǩ? ˭? Ū ?????????????? ???????????  鴢 紣 㴢 ⳡ ޴? ܴᷟ? ⺡ 㻢 Ḥ⹥ ޴? ݳ? 1? ܲ? 1? خ? ׭? ٯ? ֮? ѫ? Ъ? ̨? մ? յ? ǫ? ٿ? һ ???? ˙U? ɳ? ɳ? ɱ? ɱ? ˰? ˮ? ɪ? Ȧ? ͫ? ֵ? ұ? Ť? ¡? ʩ? Ӳ? Ϯ? ͫ? ϭ ? ѯ? ѯ? Ϭ? ̭? ˰? Ͷ? ͵? ˳? ʱ? ǯ? ȯ? ε? ӷ? ϳ? ̯? ɬ? ̫? ͬ? ͭ? ˪? ΰ? ͮ? ί? Ӵ? Ӷ ? ς? ˮ? ɬ? ʭ? Ѵ? ҵ? г? ς? ˮ? ȫ? ɬ? ǩ? ρ? в? ˭? ʬ? ˭? ̭? ί? ͮ? ͮ? ͮ? ί? ˬ? ȩ ? ʫ? ͮ? ղ? ү? Ӳ? ֵ? Ҵ? ѳ? ς? ˮ? ȭ? ˰? ˮ? ˮ? ͯ? ̮? ̬? ͯ? ˮ? ˲? ȯ? ƭ? ˙U? ˙U ? ®? ¯ ????????????????????????????????????? ¨? é? é? ū? ¨ ??????????????????????????????? ī? ī? ī? и? и? ī? ū? ū? é ?? ????? ĭ? ˙U? ® ??????????? © ?????????? ȫ? ȫ? ȫ? ɫ? ̭? ̭? ˭? ʬ? ɫ? ʬ? ʮ? ˯? ˯? ˯? ˯? Ȭ? Ȫ? ɫ? ̮? ͯ? ρ? ѳ? ӵ? Ѵ? б? κ? ϭ? ά? Ѯ? Ա? Ӱ? Э? ϭ? ү? ү? Э? ά? ѯ? וי? ӭ? ϩ? ͧ? ϧ? ѩ? Ԭ? ذ? խ? ѩ? Ϧ? Ϧ? Ч? ҩ? ҩ? ҩ? ת? ث? ׭? خ? ׯ? ֮? կ? կ? Ԭ? խ? ج? ج? ܬ? ߰? 㳩 䴨 峨 ݫ? 7? ެ? 䲧 峨 䲧 䲧 Ⱗ 䲩 붮? س 국굯  ??????? 걦뱥 جمي ??? ???????????????????????????????????? ± ???? ð ???????? ????????????????????????????????????????? æ? ˙U? ç? é? я ? Мобайл ??????? £? Ʀ? Ʀ? ƥ? Ť ????????? Ť ƥ ɧ ʨ ͫ ά ʩ Т Ч ǩ Ť Ƨ ˬ ɭ |? ?????????????????? ????????????? ç ???????????????????????????????????? ?????????????????????????????????????????????????? ????????????????????????????? ñ? °? ñ î ?????????? ????? ??????????????????? 鲯 豮 汭 尬 䯫 汭 곮췱 洫 ᱧద 嵫 緭 䴪 ᯦᯦ 䲩 洫 鴬 鴬 鴬 국국 贩 춬 ?????? 뵩괪 ??? ??????? ? 겱 ⪭ ???? 겳 ??? 뵫 贩 贩 趫 긭 긭긭 跩 綨 깫 컭궩 糦 뵩뷩  켨컪 鸧 綨 浧 絬 鷮 鷰 峬 洫 ???  긭 跩 긭캱 캳깲 綯㳩 ᱧ 㳧 嵩 㵨 ᳦᳤ჵ 乩 缬 轭 轭 缬 ߴ? 0? ߴ? 幬

main.cc

int main() { 

char fileName[50] = "binary_pixels.txt"; 
int width = 0; // width of the image 
int height = 0; // heigt of the image 
int size = 128; // size of the array 

// read the PPM file and store its contents inside an array and return 
// the pointer to that array to pixelArray 
unsigned char* pixelArray[size] = readPPM(fileName, &width, &height); 

// print the contents of the array 
for (int i = 0; i < 128; i++) { 
    printf("%s\n", pixelArray[i]); 
} // end of for loop 

} // end of main 

readPPM.cc

unsigned char readPPM(const char* fileName, char* pSix, int* width,   
int* height, int* maximum) { 

// open the file to read just the header reading 
FILE* fr = fopen(fileName, "r"); 

// formatted read of header 
fscanf(fr, "%s", pSix); 

// check to see if it's a PPM image file 
if (strncmp(pSix, "p6" , 10) != 0) { 
    printf("They are not the same\n"); 
} else { 
    printf("They are the same\n"); 
} 

// read the rest of header 
fscanf(fr, "%d\n %d\n", width, height); 

fscanf(fr, "%d\n", maximum); 

// check to see if they were stored properly 
printf("PSix: %s\n", pSix); 
printf("Width: %d\n", *width); 
printf("Height: %d\n", *height); 
printf("maximum: %d\n", *maximum); 

// allocate array for pixels 
unsigned char* pixels = new unsigned char[width * height]; 

// unformatted read of binary pixel data 
while (fread(pixels, sizeof(pixel), 128, fr)) { 
    printf("%s", pixels); 
} // end of for loop 

// close file 
fclose(fr); 

// return the array 
return pixels; 

} // end of readPPM 
+2

Если ваша программа должна быть чистым кодом c, вы не можете использовать 'new'. В C это делается с помощью 'malloc()' (включая 'stdlib.h'). – Scheff

+0

Тип 'pixelArray' в' main' неверен. Это должно быть 'unsigned char * pixelArray' (без' [size] '). – Scheff

+0

Я успешно сохранил заголовок (P6, 650, 652 и 255)) в своих правых переменных (я знаю, потому что я попробовал распечатать их значения, и они вышли правильно). Мой вывод показан ниже. Мне было интересно, что это за бесхитростные персонажи ниже максимума. Являются ли эти данные двоичными пикселями? Если это так, тогда мне просто нужно написать мою функцию writePPM. – asilvester635

ответ

0
//struct to hold a pixel. 
struct rgb 
{ 
    char r; 
    char g; 
    char b; 
}; 

//struct to hold the image and its info. 
struct image 
{ 
    char p; 
    int format; 
    int width; 
    int height; 
    int intensity; 
    //struct rgb **rgb; 
    unsigned char *pixels; 
}; 

int main(void) 
{ 
    struct image m; 
    FILE *fp = //fopen(...); 

    fscanf(fp, "%c%d\n", &m.p, &m.format); 

    fscanf(fp, "%d %d\n", &m.width, &m.height); 

    fscanf(fp, "%d\n", &m.intensity); 

    printf("%c%d\n", m.p, m.format); 
    printf("%d %d\n", m.width, m.height); 
    printf("%d\n", m.intensity); 

    //allocate array to hold the pixels 
    m.pixel = (unsigned char*)malloc(m.width*m.heigth*3*sizeof(unsigned char)); 

    //read pixels into m.pixel 
    return 0; 
} 
+0

Я успешно сохранил заголовок (P6, 650, 652 и 255)) в своих правых переменных (я знаю, потому что я пытался печать их ценностей, и они вышли правильно). Мой вывод показан ниже. Мне было интересно, что это за бесхитростные персонажи ниже максимума. Являются ли эти данные двоичными пикселями? Если это так, тогда мне просто нужно написать мою функцию writePPM. Я также обновил свой код. – asilvester635

0

Вы не чтение полукокса в правильное место.pixels уже указатель на char с, так что вы должны передать его как в fscanf:

fscanf(fr, "%c", pixels) 

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

+0

Я успешно сохранил заголовок (P6, 650, 652 и 255)) в своих правых переменных (я знаю, потому что я попробовал распечатать их значения, и они вышли правильно). Мой вывод показан ниже. Мне было интересно, что это за бесхитростные персонажи ниже максимума. Являются ли эти данные двоичными пикселями? Если это так, тогда мне просто нужно написать мою функцию writePPM. Я также обновил свой код. – asilvester635

+0

Когда вы найдете ответ на свой вопрос, вы должны закрыть вопрос, выбирая правильный ответ - отправляя его самостоятельно, если это необходимо, - и закройте вопрос. * Не * изменить вопрос. – kmkaplan

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