
Nesse vídeo criamos imagens do zero com C++ sem bibliotecas!
Links da Wikipedia sobre formato de imagens:
color.cpp
#include <iostream>
#include <fstream>
int main(){
  std::ofstream image("image.ppm");
  const int width = 800, height = 450;
  if(image.is_open()){
    image << "P3\n";
    image << width << " " << height << '\n';
    image << "255\n";
    for(int y = 0; y < height; ++y){
      for(int x = 0; x < width; ++x){
        image << "214 5 175 ";
      }
      image << '\n';
    }
    image.close();
  }
}
rect.cpp
#include <iostream>
#include <fstream>
int main(){
  std::ofstream image("image.ppm");
  const int width = 800, height = 450;
  const int rectX = 45, rectY = 45, rectW = width - 100, rectH = height - 100;
  if(image.is_open()){
    image << "P3\n";
    image << width << " " << height << '\n';
    image << "255\n";
    for(int y = 0; y < height; ++y){
      for(int x = 0; x < width; ++x){
        if(x >= rectX && x < rectX + rectW && 
           y >= rectY && y < rectY + rectH){
          image << "214 5 175 ";
        }else{
          image << "253 204 59 ";
        }
      }
      image << '\n';
    }
    image.close();
  }
}
circle.cpp
#include <iostream>
#include <fstream>
int main(){
  std::ofstream image("image.ppm");
  const int width = 800, height = 450;
  const int centerX = width / 2;
  const int centerY = height / 2;
  const int radius = 80;
  if(image.is_open()){
    image << "P3\n";
    image << width << " " << height << '\n';
    image << "255\n";
    for(int y = 0; y < height; ++y){
      for(int x = 0; x < width; ++x){
        const int dx = x - centerX;
        const int dy = y - centerY;
        if(dx * dx + dy * dy <= radius * radius){
          image << "214 5 175 ";
        }else{
          image << "253 204 59 ";
        }
      }
      image << '\n';
    }
    image.close();
  }
}
gradiente.cpp
#include <iostream>
#include <fstream>
int main(){
  std::ofstream image("image.ppm");
  const int width = 800, height = 450;
  if(image.is_open()){
    image << "P3\n";
    image << width << " " << height << '\n';
    image << "255\n";
    for(int y = 0; y < height; ++y){
      for(int x = 0; x < width; ++x){
        const int r = (255 * x) / (width - 1);
        const int g = 0;
        const int b = 255;
        image << r << " " << g << " " << b << " ";
      }
      image << '\n';
    }
    image.close();
  }
}
lenna.cpp→convert $1 -compress none -depth 8 -colorspace RGB -define pgm:format=plain $2
#include <iostream>
#include <fstream>
int main(){
  std::ifstream input("./lenna.ppm");
  std::ofstream output("./lenna_bw.ppm");
  std::string format;
  int width, height, maxval;
  input >> format >> width >> height >> maxval;
  output << format << '\n' << width << " " << height << '\n' << maxval << '\n';
  for(int i = 0; i < width * height; ++i){
    int r, g, b;
    input >> r >> g >> b;
    int gray = static_cast<int>(0.9f * r + 0.8f * g + 0.7f * b);
    //int bw = (gray > 100) ? maxval : 0;
    //output << bw << " " << bw << " " << bw << " ";
    output << gray << " " << gray << " " << gray << " ";
  }
}