C ++ crea png / bitmap a partir de una matriz de números

Así que encontré este enlace con respecto a mi pregunta, pero es para C #

Crear un PNG a partir de una matriz de bytes

Tengo una variable int matriz de números. Lo llamaré "pix []" por ahora, puede tener cualquier tamaño de 3 a 256, más tarde posiblemente más grande.

Lo que quiero hacer ahora es convertirlo en una imagen de píxeles. Todavía soy un noobin c ++, así que discúlpeme. Intenté descargar algunas bibliotecas que hacen que trabajar con libpng sea más fácil, pero parece que no funcionan (ubuntu, code :: blocks). Tengo algunas preguntas a continuación:

1) ¿cómo se crea un nuevo mapa de bits (qué bibliotecas, qué comando)?

2) ¿cómo lo relleno con información de "pix []"?

3) ¿como lo guardo?

si es un reenvío de una pregunta, también estoy contento con un enlace;)

Esto es lo que he trabajado hasta ahora, gracias por su ayuda.

int main(){
 FILE *imageFile;
 int x,y,pixel,height=2,width=3;

 imageFile=fopen("image.pgm","wb");
 if(imageFile==NULL){
  perror("ERROR: Cannot open output file");
  exit(EXIT_FAILURE);
 }

 fprintf(imageFile,"P3\n");           // P3 filetype
 fprintf(imageFile,"%d %d\n",width,height);   // dimensions
 fprintf(imageFile,"255\n");          // Max pixel
  int pix[100] {200,200,200, 100,100,100, 0,0,0, 255,0,0, 0,255,0, 0,0,255};


       fwrite(pix,1,18,imageFile);


fclose(imageFile);
}

No he entendido completamente lo que hace. Puedo abrir la imagen de salida, pero no es una representación correcta de la matriz.

Si cambio las cosas, por ejemplo, haciendo una matriz bidimensional, el visor de imágenes me dice "esperaba un número entero" y no me muestra una imagen.

Hasta aquí todo bien. Como tengo la matriz antes de la imagen, creé una funciónaufrunden para redondear al siguiente número int porque quiero crear una imagen cuadrada.

int aufrunden (double h)
{
int i =h;
if (h-i == 0)
  {
  return i;
  }
else
  {
  i = h+1;
  return i;
  }
}

Esta función se usa en la creación de la imagen. Si la imagen es más grande que la información que proporciona la matriz de esta manera (a es la longitud de la matriz)

double h;
h= sqrt(a/3.0);
int i = aufrunden(h);
FILE *imageFile;                           
int height=i,width=i;

Puede suceder ahora, que la matriz esa=24 largo.aufrunden hace que la imagen sea 3x3 para que tenga 27 valores ... lo que significa que le faltan los valores para 1 píxel. O peor, es soloa=23 largo. También creando una imagen de 3x3.

Que va afwrite(pix,1,18,imageFile); escribir en esos píxeles para obtener información? Sería mejor si los valores restantes son solo 0.

* editar no importa, solo agregaré 0 al final de la matriz hasta que esté llenando todo el cuadrado ... lo siento

Respuestas a la pregunta(3)

Su respuesta a la pregunta