2010-03-06 3 views
0

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

void scale_file(char *infile, char *outfile, float scale) 
{ 
    // open files for reading 
    FILE *infile_p = fopen(infile, 'r'); 
    FILE *outfile_p = fopen(outfile, 'w'); 

    // init data holders 
    char *data; 
    char *scaled_data; 

    // read each byte, scale and write back 
    while (fread(&data, 1, 1, infile_p) != EOF) 
    { 
     *scaled_data = (*data) * scale; 
     fwrite(&scaled_data, 1, 1, outfile); 
    } 

    // close files 
    fclose(infile_p); 
    fclose(outfile_p); 
} 

Что заставляет меня, как сделать каждый байт умножение (шкала 0-1.0 поплавок) - я уверен, что я либо чтение это неправильно или отсутствует что-то большое. Кроме того, данные считаются неподписанными (0-255). Пожалуйста, не судите мой бедный код :)

благодаря

+0

Вы хотите его масштабировать, как при изменении размера изображения или что? – uray

+0

просто измените значения пикселей, а не измените размер всего изображения. – sa125

+3

Существует не какой-либо стандартный формат файла изображения, который не будет уничтожен этим кодом. Они не просто содержат blob байтов, которые представляют пиксели. Есть заголовок и метаданные, пиксельные данные часто сжимаются. Взгляните на ImageMagick. –

ответ

2
  1. изменение char *scaled_data; к char scaled_data;
  2. изменение *scaled_data = (*data) * scale; к scaled_data = (*data) * scale;

Что бы получить вам код, который будет делать то, что вы пытаетесь сделать, но ....

Это может только возможно, работайте над файлом изображения собственного пользовательского формата. Не существует стандартного формата изображения, который просто удаляет пиксели в байтах в файле в последовательном порядке. Графические файлы должны знать больше информации, как

  1. высоту и ширину изображения
  2. Как представлены пиксели (1 байты серых, цвет 3 байта, и т.д.)
  3. Если пиксели представлены в виде индекса в палитре, они имеют палитру
  4. Все виды другой информации (координаты GPS, программное обеспечение, создавшего его, дату его создания, и т.д.)
  5. метод сжатия, используемый для пикселей

Все это называется Метаданные

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

3
char *data; 
char *scaled_data; 

Памяти не была выделена для этих указателей - зачем вам указатели на них? unsigned char переменные будут в порядке (unsigned, потому что это имеет больше смысла для данных байта).

Кроме того, что происходит, когда шкала снимает значение из 256-диапазона? Вы хотите насыщения, обертывания или что?

+0

Если это превысит, я закрепите его на 255, хотя, поскольку он находится в масштабе 0-1.0, это, вероятно, не будет. Тем не менее, вы правы - это не мешает проверке. – sa125

+0

@ sa125: в данный момент в вашем коде нет обрезания, однако –

1

почему вы думаете, что вы не правы, я вижу ничего плохого в своем алгоритме не является эффективным и char *data; и char *scaled_data; кроме должны быть unsigned char data; и unsigned char scaled_data;

1

Мое понимание растрового изображения (только сырые данные) является то, что каждый пиксель представлен тремя номерами по одному для RGB; умножая каждый на число < = 1, просто сделает изображение темнее. Если вы пытаетесь сделать изображение более широким, вы можете просто вывести каждый пиксель дважды (удвоить размер) или просто вывести каждый другой пиксель (уменьшить вдвое), но это зависит от того, как его растеризовать.

+0

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

2

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

Файлы изображений представляют собой сложные форматы с заголовками и полями и всевозможные забавные вещи, которые необходимо интерпретировать. Возьмите совет nobugz и зарегистрируйтесь ImageMagick. Это библиотека, которая делает именно то, что вы хотите.