Me he propuesto, como ejercicio. Idear una función que amplie el tamaño de una imagen.
De momento, he hecho mi "imagen virtual" con un array:
unsigned char[10][10] Ejemplo =
{{0,0,0,2,0,0,0,0,0,0},
{0,0,2,2,0,0,2,2,0,0},
{0,4,4,4,2,2,4,4,0,0},
{4,4,4,4,4,2,4,4,4,0},
{4,4,4,4,4,4,4,4,4,0},
{4,4,4,4,4,4,4,4,4,0},
{4,4,4,4,4,4,4,4,4,0},
{4,4,4,4,4,4,4,4,4,0},
{0,4,4,4,4,4,4,4,0,0}};
Cada número representa un color de la paleta de colores, dibujando los pixeles uno a uno tenemos la imagen.
He ideado este algoritmo por el momento (Objetivo es la imagen original, y Devolver es la imagen ampliada):
void Escalar(Sprite Objetivo,Sprite Devolver,int x, int y,int Escala)
{
for (int j = 0; j < y; j++)
for (int i = 0; i < x;i++)
for (int l = j*Escala; l <= (j*Escala)+Escala;l++)
for (int k = i*Escala; k <= (i*Escala)+Escala;k++)
Devolver[k][l] = Objetivo[i][j];
}
Basicamente, lo que hace es repetir los números de una matriz. Obtenemos el siguiente resultado (Escala = 2):

Ejemplo Original:
(0,0,0,4,4,4,4,4,0,0,)
0,0,4,4,4,4,4,4,4,0,)
0,2,4,4,4,4,4,4,4,0,)
2,2,4,4,4,4,4,4,4,0,)
0,0,2,4,4,4,4,4,4,0,)
0,0,2,2,4,4,4,4,4,0,)
0,2,4,4,4,4,4,4,4,0,)
0,2,4,4,4,4,4,4,4,0,)
0,0,0,4,4,4,4,4,0,0,)
0,0,0,0,0,0,0,0,0,0,)
Ejemplo Ampliado:
(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,)
0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,)
0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,0,0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,0,0,2,2,2,2,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,0,)
0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,)
0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,)
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,)
Parece que hemos conseguido nuestro objetivo, pero... Probemos ahora un valor de escala grande (20):

¡La imagen sale cuadriculada!. ¿Cómo puedo conseguir que salga más "redondeada"?. ¿Alguna idea?
PD: La imagen no sale pixelada, las manchas que se ven allí han salido al pasar las capturas a PNG