проблема записи изображения stb - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь записать простой файл изображения на диск, используя stb_image_write.Я использую самый простой тестовый пример: изображение RGB 128 на 128 пикселей.

Я нашел этот пример в Интернете, и парень, кажется, говорит, что он работает нормально, плюс он выглядит точно так же, как я писал для 2часы:

void save_image(int w, int h, int channels_num)
{

    int data[w * h * channels_num];

     int index = 0;
     for (int j = h - 1; j >= 0; --j)
     {
      for (int i = 0; i < w; ++i)
      {
       float r = (float)i / (float)w;
       float g = (float)j / (float)h;
       float b = 0.2f;
       int ir = int(255.0 * r);
       int ig = int(255.0 * g);
       int ib = int(255.0 * b);

       data[index++] = ir;
       data[index++] = ig;
       data[index++] = ib;
      }
     }

    stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);
}

save_image(128, 128, 3);

Результатом должен быть хороший градиент цвета, но все, что я могу получить, - это правильный файл с вертикальными красными, зелеными, синими и черными линиями.Размеры изображения в порядке, хотя.Я действительно не нахожу решение здесь.Я нахожусь на Linux Джесси.Может ли быть проблема 'endianess' или что-то подобное?

Ответы [ 2 ]

1 голос
/ 08 мая 2019

На вопрос ответили в комментариях.Мне пришлось заменить: int data [] на: unsigned char data [];

0 голосов
/ 08 мая 2019

=============== Эта часть не была точной. пожалуйста, смотрите мою часть решения ниже ====

int data [w * h * channel_num]; все в порядке, это не причина, по которой вы потерпели неудачу.

Изменить эту строку

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);

до

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * sizeof(int));

Вы получите то, что хотите. По последним параметрам я считаю это шагом. Если это так, шаг означает смещение между двумя линиями. Исходя из вашего вопроса, я предполагаю, что у вас есть цвет 128 х 128 х 32 бита. Тогда шаг будет w * sizeof (int).

Если НЕТ, дайте мне знать.

Извините, я спешил на встречу.

============ Эта часть является частью решения ====

Да,

int data[w * h * channels_num]; 

должно быть

unsigned char data[w * h * channels_num];

Плюс,

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, 100);

следует изменить на

stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * channels_num);

Полное решение

void save_image(int w, int h, int channels_num)
{
    unsigned char data[w * h * channels_num];

    int index = 0;
    for (int j = h - 1; j >= 0; --j)
    {
        for (int i = 0; i < w; ++i)
        {
            data[index++] = (unsigned char)(255.0 * i / w);
            data[index++] = (unsigned char)(255.0 * j / h);
            data[index++] = (unsigned char)(255.0 * 0.2);
        }
    }

    stbi_write_jpg("jpg_test_.jpg", w, h, channels_num, data, w * channels_num);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...