2012-03-18 2 views
0

Я пытаюсь прочитать данные пикселя из файла PPM. У меня есть функция для чтения заголовка, поэтому я знаю, что это указывает на начало данных пикселя. Я попытался использовать fgetc (файл), но если значение больше одной цифры, это не сработает. Я также попытался использовать массив и преобразовать массив в int или char, но у меня нет способа узнать, сколько цифр каждого значения. Я также не уверен, что значения разделены пробелом или нет. В основном мне нужен способ извлечь данные пикселя. (Я использую С)Чтение пиксельных данных в файле PPM с использованием C

Мой код прямо сейчас:

char read_byte(FILE *ipt) { 
    int c, i=0, sum=0; 
    while (i<16) { 
     c=fgetc(ipt); 
     if((i%2)!=0 { 
      if(c&1) { 
       sum+=pow(2,i/2); 
      } 
     } 
     i++; 
    } 
    return (char)sum; 
} 

EDIT: Сначала я думал, что файл был сохранен в качестве значений ASCII, то я понял, что хранится в двоичном виде. Прямо сейчас, я думаю, что я делаю это как шестнадцатеричный. Я не уверен, что это правильно. Я действительно застрял.

EDIT: изменил мой код немного

char read_byte(FILE *ipt) { 
    int c, i=0, sum=0; 
    while(i<8) { 
     c = fgetc(ipt); 
     c=c&1; 
     sum+=c*pow(2,i); 
     i++; 
    } 
    return sum; 
} 

I напечатать сумму в качестве% с

+1

Этот ответ может направить вас в правильном направлении: http://stackoverflow.com/questions/2693631/read-ppm-file-and-store-it -in-a-array-coded-with-c –

+1

Покажите нам, что вы пробовали. – Bart

+0

Нам нужно больше кода. Правильно ли программа считывает все первые 8 частей файла, как описано в http://netpbm.sourceforge.net/doc/ppm.html, если она есть, то она имеет размер, ширину и высоту изображения данных и maxvalue, что дает количество байтов (1 или 2) каждого цветового компонента. – gbulmer

ответ

1

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

Существует решение с открытым исходным кодом. «Netpbm представляет собой пакет графических программ и библиотека программирования.», Которая включает в себя программу для чтения PPM в http://netpbm.sourceforge.net/doc/

Edit: У вас есть, или прочитать определение формата файл, например, http://netpbm.sourceforge.net/doc/ppm.html?

Похоже, что данные представляют собой последовательности последовательностей одного байта RGB или последовательности двух байтов RGB.

Программа может определить, какой формат используется из пункта 7 «Максимальное значение цвета (Maxval)». Он говорит: «Если Maxval меньше 256, это 1 байт, в противном случае это 2 байта».

Таким образом, вы кодируете функцию, которая считывает однобайтовые/компонентные данные RGB, а затем кодирует другую для чтения двухбайтовых/компонентных RGB-данных.

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

Редактировать {

В соответствии с документом в этой ссылке, данные изображения в м.д. марки «P6» является двоичным.

Поэтому, если MaxValue равен < 256, и, следовательно, данные для каждого цветового компонента являются одним байтом, а затем чтение трех байтов с тремя вызовами fgetc (fp) возвращает двоичное значение одного пикселя RGB.

Если программа прочитала заголовок, она имеет значения ширины и высоты для данных изображения. Таким образом, он может выделять массив для каждой строки (ширина ширины RGB-пикселей) и массив указателей на каждый выделенный массив строк пикселей. Затем читайте двоичные данные в каждой строке, и у программы есть что-то прямое, чтобы работать; массив 2d.

} конец редактировать

Мое чтение вашего вопроса предполагает, что Вы уже знаете, как читать один байт данных с использованием fgetc.

Редактировать - кажется, что это не имеет значения: Вы можете прочитать данные двух байтов, дважды позвонив fgetc, а также сдвинув и бит или данные, например. (Частично игнорируя проверка ошибок):

int a = fgetc(fp); 
int b = fgetc(fp); 
if (a >= 0 && b >= 0) { // then all is okay 
    unsigned int twobyte = (a<<8) | b; // or (b<<8) | a; depending on byte order 
// ... 
+1

Это назначение, поэтому, вероятно, лучше избегать копирования кода. – Sams

+1

Хорошо, понял. – gbulmer

+0

Не могли бы вы добавить свой код на свой вопрос и отформатировать его как код, чтобы нам было легко читать? – gbulmer