@tj57

Как реализовать градиент серого цвета без использования графических библиотек (OpenCV и т.д.) на C/C++?

Как с использованием стандартных средств записать в текстовый файл массив, который выведет градиент серого, как на картинке? 5bfb01aa7d25a769606500.jpeg. Градиент, естественно, не получится гладким, как на картинке, но выглядеть должно примерно так.
Суть в том, что белый цвет соответствует значению 255, черный - 0. Размер картинки задаётся пользователем. Текстовый файл представляет собой изображение формата .pgm, которое можно перевести в .png с помощью конвертера. В качестве примера могу привести программу, которая рисует черную линию на белом фоне по рандомным координатам:
https://gist.github.com/tjarrow/21ad2bf49f801f44db...
Пример линии:
5bfb056a3ec59983049117.png
  • Вопрос задан
  • 1610 просмотров
Решения вопроса 1
@sddvxd
Если вам действительно нужна идея, а не код готовой программы, вот вам моя мысль:

int rows = 0, cols = 0;
    cout << "Enter size (Example: 200x200)\n";
    cin >> rows >> cols;
    if(rows <= 0 || cols <= 0) throw runtime_error("Bad size");
    int pixmap[rows][cols];
    for(int i = 0; i < rows; ++i){
        double position = double(i) / rows;   //Вычисляем "высоту"
        int color = position * 255;                 //и находим подходящий цвет
        cout << position << " " << color << '\n';
        for(int j = 0; j < cols; ++j)
            pixmap[i][j] = color;
    }


FINAL VERSION:
#include <iostream>
#include <cstdio>
using namespace std;

void main()
{
    int rows = 0, cols = 0;
    char* filename = "test.pgm";
    cout << "Enter size and filename (Example: 200x200 mygradient.pgm)\n";
    cin >> rows >> cols >> filename;
    if(rows <= 0 || cols <= 0) throw runtime_error("Bad size");
    FILE* pfile = fopen(filename, "w");
    fprintf(pfile, "P2\n%d %d\n255\n", cols, rows);
    for(int i = 0; i < rows; ++i){
        double position = double(i) / rows;
        int color = position * 255;
        cout << position << " " << color << "\n";
        for(int j = 0; j < cols; ++j)
            fprintf(pfile, "%d ", color);
        fprintf(pfile, "\n");
    }
}


Вводить например вот так: 1500x400 file.pgm
5bfb1d672efdc256620573.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы