2013-12-08 14 views
0

Я пишу свой собственный растровый генератор в c, и я столкнулся с каким-то поведением, которое я не могу понять.Запись растрового изображения 24-битное цветное нечетное поведение

Я храню пиксельные данные в 2D-массиве структуры пикселей, которую я написал. Я пишу свои структуры непосредственно в файл после заголовков.

typedef struct { 
    uint8_t blue; 
    uint8_t green; 
    uint8_t red; 
} pixel_24; 

Растровые изображения сплошного цвета работали правильно, но при попытке создания градиентов я столкнулся с проблемой. Изображения выходили из строя. После некоторых экспериментов я обнаружил, что любое изображение, содержащее пиксель с величиной r, g или b, будет выглядеть поврежденным. Я изменил мой код, чтобы избежать всех 10-х в моих цветовых каналов, как это:

void load_pixels(pixel_24 pixels[VSIZE][HSIZE]) 
{ 
    unsigned int y, x; 

    for (y = 0; y < VSIZE; y++) 
    { 
     for (x = 0; x < HSIZE; x++) 
     { 
      uint8_t b = (x+y)/4; 
      uint8_t g = 255 - (x+y)/4; 
      uint8_t r = 0; 
      pixels[y][x] = (pixel_24) {b, g, r}; 
      if (b==10) 
      { 
       pixels[y][x].blue = 9; 
      } 
      if (g==10) 
      { 
       pixels[y][x].green = 9; 
      } 
      if (r==10) 
      { 
       pixels[y][x].red = 9; 
      } 
     } 
    } 
} 

Это дает правильный градиент: bitmap gradient

Когда я извлекаю если заявления, которые я получаю: strange bitmap

Что я нужно знать о растровых изображениях, чтобы избежать подобных проблем?

+4

Случайное предположение, но '10' - символ новой строки (' \ n') - вы случайно открываете свой выходной файл в текстовом режиме, а не в двоичном формате? Если это так, он может заменять каждую '10' на последовательность' \ r \ n'. –

+0

@RogerRowland: Это определенно проблема здесь! –

+1

Вот и все. Игнорирование * шага * будет его следующей проблемой. –

ответ

1

RogerRowland получил его. Я открывал файл в текстовом режиме, когда мне требовалось двоичное.

+1

Вы можете принять свой собственный ответ –