colorines.c

Código

El 15 de abril del 2019 vi un cuarto de baño de un restaurante cuya pared estaba adornada con un mosaico de cuadrados de diferentes tonalidades de azul.

Me gustó la idea de generar mosaicos (tablas) de rectángulos de tonalidad de algún color o incluso, su representación en clave de códigos #rrggbb (RGB).

Me planteo realizar un programa que los genere utilizando algún lenguaje de programación de los que manejo más o menos mal: C o JavaScript. Por supuesto, si pienso que el resultado podría ser una página web, el más lógico de los lenguajes sería JavaScript, así que inmediatamente me decanto por realizarlo en C.


/********************************************************
	Proyecto colorines (escrito en C)
	realizado por Giusseppe Domínguez
	a partir del día 26 de abril de 2019
********************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define KO 0

int tablas(FILE *fichero, int formato);
int colorines(FILE *fichero, int formato, int quecolor, int color1, int color2);
int firma(FILE *fichero);

int main(int argc, char *argv[])
{
  int i, formato=0;
  char *loquesea, *extension[] = { "txt", "html" }, nombrefichero[27];
  FILE *fichero;

  if (argc != 2)
  {
    printf("\n\nUtilización: %s [1 para html | 0 para txt]\n\n", argv[0]);
    return KO;
  }
  formato = strtol(argv[1], &loquesea, 10);
  // Verificamos que lo introducido es un número natural
  if ((loquesea == argv[1]) || (*loquesea != '\0') || (formato < 0) || (formato > 1)) {
    printf ("|%s| No es un argumento válido\n", argv[1]); return KO;
  }

  // Creamos 81 Tablas en el formato especificado en distintos archivos
  for (i=1; i<=81; i++) {
    sprintf(nombrefichero, "%s/tabla%02d.%s", extension[formato], i, extension[formato]);
    printf("\nNombrefichero= |%s|", nombrefichero);
    fichero = fopen(nombrefichero, "a");        
    if (fichero==NULL) { printf("Error abriendo el fichero %s", nombrefichero); return KO;}
    // Creamos las tablas en el fichero
    sleep(1);
    tablas(fichero, formato);
    fclose(fichero);
  }
}

/******************************************
  La función tablas genera un par de tablas
  en el formato indicado [1 para html | 0 para txt]
  de un color elegido aleatoriamente entre
  0 - rojo, 1 - verde, 2 - azul
  fijando también aleatoriamente la base (RGB)
  de los otros dos colores color1, color2
  entre 0 y 200 en formato exadecimal para
  excluir los colores muy saturados.
******************************************/
int tablas(FILE *fichero, int formato)
{
  char *colores[]= {"rojo", "verde", "azul"};
  int color1, color2, quecolor;
  /* Aleatoriamente elegidos los dos otros colores */
  srand(time(NULL));
  color1 = rand() % 200;
  color2 = rand() % 200;
  quecolor = rand() % 3;

  if (formato == 1) fprintf(fichero, "<h2>");
  fprintf(fichero, "256 Tonos de %s\n", colores[quecolor]);
  if (formato == 1) fprintf(fichero, "</h2>");

  switch (quecolor) { 
    case 0: fprintf(fichero, "Sobre una base de %s=%02X y %s=%02X\n", colores[1], color1, colores[2], color2); break; // rojo
    case 1: fprintf(fichero, "Sobre una base de %s=%02X y %s=%02X\n", colores[0], color1, colores[2], color2); break; // verde
    case 2: fprintf(fichero, "Sobre una base de %s=%02X y %s=%02X\n", colores[0], color1, colores[1], color2); break; // azul
    default: fprintf(fichero, "colorines necesita código 0=rojo, 1=verde, 2=azul\n"); return KO;
  }

  colorines(fichero, formato, quecolor, color1, color2);
  firma(fichero);

  if (formato == 1) fprintf(fichero, "<h2>");
  fprintf(fichero, "256 Tonos Básicos de %s\n", colores[quecolor]);
  if (formato == 1) fprintf(fichero, "</h2>");

  colorines(fichero, formato, quecolor, 0, 0);
  firma(fichero);
  return OK;
}

/******************************************
  La función colorines devuelve una "tabla"
  de 16x16 colores en función del parámetro
  quecolores: verde, rojo, azul
  color1 y color2, de 0 a 255
******************************************/
int colorines(FILE *fichero, int formato, int quecolor, int color1, int color2)
{
  char *colores[]= {"rojo", "verde", "azul"};
  int  c1, c2, color[3], orden[3];
  char cad_color[6];

  color[1]=color1;
  color[2]=color2;

  /* rojo orden=0,1,2 verde orden=1,0,2 azul orden=1,2,0 */
  switch (quecolor) { 
    case 0: orden[0]=0; orden[1]=1; orden[2]=2; break; // rojo
    case 1: orden[0]=1; orden[1]=0; orden[2]=2; break; // verde
    case 2: orden[0]=1; orden[1]=2; orden[2]=0; break; // azul
    default: printf("colorines necesita código 0=rojo, 1=verde, 2=azul\n"); return KO;
  }

  if (formato == 1) fprintf(fichero, "<table width=100%%>");

    for (c1=0; c1<16; c1++) { /* para las 16 filas ... */
    if (formato == 1) fprintf(fichero, "<tr>");

    for (c2=0; c2<16; c2++) { /* para las 16 columnas ... */
      color[0] = c1*16+c2;
      /* rojo orden=0,1,2 verde orden=1,0,2 azul orden=1,2,0 */
      sprintf(cad_color, "%02X%02X%02X", color[orden[0]], color[orden[1]], color[orden[2]]);

      if (formato == 1) fprintf(fichero, "<td bgcolor=#%s width=6,25%%>%s</td>", cad_color, cad_color);
      else fprintf(fichero, "%s ", cad_color);
    } /* fin de las 16 columnas */
    if (formato == 1) fprintf(fichero, "</tr>");

    fprintf(fichero, "\n");
    } /* fin de las 16 filas */
  if (formato == 1) fprintf(fichero, "</table>");

  return OK;
}


int firma(FILE *fichero)
{
  time_t tiempo = time(0);
  struct tm *tiempolocal = localtime(&tiempo);
  char txt_firma[128];
  strftime(txt_firma,128,"\nGiusseppe Domínguez, a las %H:%M. M-%Y%m%d\n",tiempolocal);
  fprintf(fichero, "%s\n",txt_firma);
  return OK;
}

colorines.c

Ejecución

La salida de este programa compilado es la siguiente:

256 Tonos de rojo
Sobre una base de verde=40 y azul=08
004008 014008 024008 034008 044008 054008 064008 074008 084008 094008 0A4008 0B4008 0C4008 0D4008 0E4008 0F4008 
104008 114008 124008 134008 144008 154008 164008 174008 184008 194008 1A4008 1B4008 1C4008 1D4008 1E4008 1F4008 
204008 214008 224008 234008 244008 254008 264008 274008 284008 294008 2A4008 2B4008 2C4008 2D4008 2E4008 2F4008 
304008 314008 324008 334008 344008 354008 364008 374008 384008 394008 3A4008 3B4008 3C4008 3D4008 3E4008 3F4008 
404008 414008 424008 434008 444008 454008 464008 474008 484008 494008 4A4008 4B4008 4C4008 4D4008 4E4008 4F4008 
504008 514008 524008 534008 544008 554008 564008 574008 584008 594008 5A4008 5B4008 5C4008 5D4008 5E4008 5F4008 
604008 614008 624008 634008 644008 654008 664008 674008 684008 694008 6A4008 6B4008 6C4008 6D4008 6E4008 6F4008 
704008 714008 724008 734008 744008 754008 764008 774008 784008 794008 7A4008 7B4008 7C4008 7D4008 7E4008 7F4008 
804008 814008 824008 834008 844008 854008 864008 874008 884008 894008 8A4008 8B4008 8C4008 8D4008 8E4008 8F4008 
904008 914008 924008 934008 944008 954008 964008 974008 984008 994008 9A4008 9B4008 9C4008 9D4008 9E4008 9F4008 
A04008 A14008 A24008 A34008 A44008 A54008 A64008 A74008 A84008 A94008 AA4008 AB4008 AC4008 AD4008 AE4008 AF4008 
B04008 B14008 B24008 B34008 B44008 B54008 B64008 B74008 B84008 B94008 BA4008 BB4008 BC4008 BD4008 BE4008 BF4008 
C04008 C14008 C24008 C34008 C44008 C54008 C64008 C74008 C84008 C94008 CA4008 CB4008 CC4008 CD4008 CE4008 CF4008 
D04008 D14008 D24008 D34008 D44008 D54008 D64008 D74008 D84008 D94008 DA4008 DB4008 DC4008 DD4008 DE4008 DF4008 
E04008 E14008 E24008 E34008 E44008 E54008 E64008 E74008 E84008 E94008 EA4008 EB4008 EC4008 ED4008 EE4008 EF4008 
F04008 F14008 F24008 F34008 F44008 F54008 F64008 F74008 F84008 F94008 FA4008 FB4008 FC4008 FD4008 FE4008 FF4008 

Giusseppe Domínguez, a las 13:38. M-20191116

256 Tonos Básicos de rojo
000000 010000 020000 030000 040000 050000 060000 070000 080000 090000 0A0000 0B0000 0C0000 0D0000 0E0000 0F0000 
100000 110000 120000 130000 140000 150000 160000 170000 180000 190000 1A0000 1B0000 1C0000 1D0000 1E0000 1F0000 
200000 210000 220000 230000 240000 250000 260000 270000 280000 290000 2A0000 2B0000 2C0000 2D0000 2E0000 2F0000 
300000 310000 320000 330000 340000 350000 360000 370000 380000 390000 3A0000 3B0000 3C0000 3D0000 3E0000 3F0000 
400000 410000 420000 430000 440000 450000 460000 470000 480000 490000 4A0000 4B0000 4C0000 4D0000 4E0000 4F0000 
500000 510000 520000 530000 540000 550000 560000 570000 580000 590000 5A0000 5B0000 5C0000 5D0000 5E0000 5F0000 
600000 610000 620000 630000 640000 650000 660000 670000 680000 690000 6A0000 6B0000 6C0000 6D0000 6E0000 6F0000 
700000 710000 720000 730000 740000 750000 760000 770000 780000 790000 7A0000 7B0000 7C0000 7D0000 7E0000 7F0000 
800000 810000 820000 830000 840000 850000 860000 870000 880000 890000 8A0000 8B0000 8C0000 8D0000 8E0000 8F0000 
900000 910000 920000 930000 940000 950000 960000 970000 980000 990000 9A0000 9B0000 9C0000 9D0000 9E0000 9F0000 
A00000 A10000 A20000 A30000 A40000 A50000 A60000 A70000 A80000 A90000 AA0000 AB0000 AC0000 AD0000 AE0000 AF0000 
B00000 B10000 B20000 B30000 B40000 B50000 B60000 B70000 B80000 B90000 BA0000 BB0000 BC0000 BD0000 BE0000 BF0000 
C00000 C10000 C20000 C30000 C40000 C50000 C60000 C70000 C80000 C90000 CA0000 CB0000 CC0000 CD0000 CE0000 CF0000 
D00000 D10000 D20000 D30000 D40000 D50000 D60000 D70000 D80000 D90000 DA0000 DB0000 DC0000 DD0000 DE0000 DF0000 
E00000 E10000 E20000 E30000 E40000 E50000 E60000 E70000 E80000 E90000 EA0000 EB0000 EC0000 ED0000 EE0000 EF0000 
F00000 F10000 F20000 F30000 F40000 F50000 F60000 F70000 F80000 F90000 FA0000 FB0000 FC0000 FD0000 FE0000 FF0000 

Giusseppe Domínguez, a las 13:38. M-20191116

colorines.c

256 Tonos de rojo

Sobre una base de verde=20 y azul=50

0020500120500220500320500420500520500620500720500820500920500A20500B20500C20500D20500E20500F2050
1020501120501220501320501420501520501620501720501820501920501A20501B20501C20501D20501E20501F2050
2020502120502220502320502420502520502620502720502820502920502A20502B20502C20502D20502E20502F2050
3020503120503220503320503420503520503620503720503820503920503A20503B20503C20503D20503E20503F2050
4020504120504220504320504420504520504620504720504820504920504A20504B20504C20504D20504E20504F2050
5020505120505220505320505420505520505620505720505820505920505A20505B20505C20505D20505E20505F2050
6020506120506220506320506420506520506620506720506820506920506A20506B20506C20506D20506E20506F2050
7020507120507220507320507420507520507620507720507820507920507A20507B20507C20507D20507E20507F2050
8020508120508220508320508420508520508620508720508820508920508A20508B20508C20508D20508E20508F2050
9020509120509220509320509420509520509620509720509820509920509A20509B20509C20509D20509E20509F2050
A02050A12050A22050A32050A42050A52050A62050A72050A82050A92050AA2050AB2050AC2050AD2050AE2050AF2050
B02050B12050B22050B32050B42050B52050B62050B72050B82050B92050BA2050BB2050BC2050BD2050BE2050BF2050
C02050C12050C22050C32050C42050C52050C62050C72050C82050C92050CA2050CB2050CC2050CD2050CE2050CF2050
D02050D12050D22050D32050D42050D52050D62050D72050D82050D92050DA2050DB2050DC2050DD2050DE2050DF2050
E02050E12050E22050E32050E42050E52050E62050E72050E82050E92050EA2050EB2050EC2050ED2050EE2050EF2050
F02050F12050F22050F32050F42050F52050F62050F72050F82050F92050FA2050FB2050FC2050FD2050FE2050FF2050

Giusseppe Domínguez, a las 13:42. M-20191116

256 Tonos Básicos de rojo

0000000100000200000300000400000500000600000700000800000900000A00000B00000C00000D00000E00000F0000
1000001100001200001300001400001500001600001700001800001900001A00001B00001C00001D00001E00001F0000
2000002100002200002300002400002500002600002700002800002900002A00002B00002C00002D00002E00002F0000
3000003100003200003300003400003500003600003700003800003900003A00003B00003C00003D00003E00003F0000
4000004100004200004300004400004500004600004700004800004900004A00004B00004C00004D00004E00004F0000
5000005100005200005300005400005500005600005700005800005900005A00005B00005C00005D00005E00005F0000
6000006100006200006300006400006500006600006700006800006900006A00006B00006C00006D00006E00006F0000
7000007100007200007300007400007500007600007700007800007900007A00007B00007C00007D00007E00007F0000
8000008100008200008300008400008500008600008700008800008900008A00008B00008C00008D00008E00008F0000
9000009100009200009300009400009500009600009700009800009900009A00009B00009C00009D00009E00009F0000
A00000A10000A20000A30000A40000A50000A60000A70000A80000A90000AA0000AB0000AC0000AD0000AE0000AF0000
B00000B10000B20000B30000B40000B50000B60000B70000B80000B90000BA0000BB0000BC0000BD0000BE0000BF0000
C00000C10000C20000C30000C40000C50000C60000C70000C80000C90000CA0000CB0000CC0000CD0000CE0000CF0000
D00000D10000D20000D30000D40000D50000D60000D70000D80000D90000DA0000DB0000DC0000DD0000DE0000DF0000
E00000E10000E20000E30000E40000E50000E60000E70000E80000E90000EA0000EB0000EC0000ED0000EE0000EF0000
F00000F10000F20000F30000F40000F50000F60000F70000F80000F90000FA0000FB0000FC0000FD0000FE0000FF0000

Giusseppe Domínguez, a las 13:42. M-20191116