Downgoat-ify Animals!

25

Mi avatar de Downgoat tiene varias características distintas

Sin embargo, estas características también pueden aplicarse a cualquier otro animal.

Especificación

Dada una imagen de un animal (técnicamente puede ser cualquier cosa), debe aplicarle las propiedades Downgoat.

Los píxeles de borde son los píxeles más externos de la imagen.

los color de fondo se define como el color más común en los píxeles del borde. Cuando ese color se interpreta como un color (r, g, b, a), con cada canal de [0, 256), el fondo se define como el área donde cada canal de los píxeles dados 'está dentro de 50 del " color de fondo".

El proceso:

  • Establecer el fondo y todos los píxeles transparentes para #232323,RGBA(35, 35, 35, 1.00)
  • Establezca todos los píxeles que no son el fondo para #FC0D1B,RGBA(252, 13, 27, 1.00) .
  • Refleja verticalmente la imagen
  • Agregue el texto -1en fuente Arial, en el centro de la imagen. La altura total del texto debe ser del 25% de la dimensión más pequeña de la imagen (es decir min(width, height) * 0.25).

Reglas

  • Siéntase libre de asumir que las fuentes ya están instaladas
  • Se supone que su umbral es 50, sin embargo, también puede tomar este número como entrada. Sin embargo , no obtienes ningún conteo de bytes disminuidos por hacer esto
  • Consulte nuestros valores predeterminados de E / S de imagen para cualquier pregunta relacionada con los formatos de E / S.
  • La imagen siempre tendrá un tamaño de al menos 3x3
  • Si no hay un "color de píxel de borde" más común, no importa qué color de píxel de borde use como "color de fondo", sin embargo, esto debe ser coherente.

Ejemplos

Entrada: Cabra

Salida: Downgoat


Entrada: Calamar

Salida: Downsquid

Entrada: Downgoat

Salida: Downdowngoat


Entrada: Dennis

Salida: Downdennis


Entrada: Trichoplax

Salida: Downtrichoplax


¿Más ejemplos?

Una implementación en línea está disponible aquí: vihan.org/p/downgoatify/#50


Este es el por lo que el código más corto en bytes gana. ¡Buena suerte!

Downgoat
fuente
66
-1 Primer caso de prueba no es un animal -_-
Geobits
10
-1ˢᵗ caso de prueba tampoco es un animal.
Adám
8
No soy fanático del demonio dennis
downrep_nation
1
Puede eliminar la preocupación acerca de si es un animal cambiando "animal" a "avatar" en el título y en toda la pregunta.
Glenn Randers-Pehrson el
44
¿Cuál es el punto de exigir el uso de la fuente? Lo único que esto hace es penalizar los idiomas donde el cambio de fuente toma más bytes
Fatalize

Respuestas:

9

ImageMagick 7.0.3 + bash + sed, 379 bytes

M=magick K=\#232323 P='-chop x%[fx:u[0].h-2]-0+1'
$M $1 -depth 8 ppm:W;$M W $P T;$M W -rotate 90 -shave 1x $P L
C=`$M T L +append -statistic mode +0 txt:-|sed -e "1d;s/.*#/#/;s/ .*//;q"`
$M W -background $K -flatten -fill $K -fuzz 20% -opaque $C +fuzz -fill \#FC0D1B +opaque $K -flip -pointsize %[fx:.282*min\(u[0].w,u[0].h\)] -fill white -draw 'gravity center text 0,0 "-1"' x:

Sin golf

# Make aliases for things we'll use repeatedly
M=magick K=\#232323 P='-chop x%[fx:u[0].h-2]-0+1'

# Copy the input file to a PPM file
$M $1 -depth 8 ppm:W

# Extract the border pixels into "T" (top and bottom), and "L" (left and right)
# PPM files, removing the ends from the "L" because they were already counted 
$M W $P T;$M W -rotate 90 -shave 1x $P L

# Put the borders into one strip and reduce to a txt image of the "mode"
# color on stdout, then convert the first pixel to hex format string "C"
C=`$M T L +append -statistic mode +0 txt:-|sed -e "1d;s/.*#/#/;s/ .*//;q"`

# Make background "#232323" and compose transparent pixels against it
# Convert any pixels with color within "fuzz" distance of background to #232323
# Convert any remaining pixels to "#FC0D1B"
# Flip the image vertically
# Determine pointsize for text, 1/5 of min(w,h). 1 pixel == 1.44 points
# Draw text "-1" centered on the image
# Display the result to an X window

$M W -background $K -flatten                     \
-fill $K -fuzz 20% -opaque $C                    \
+fuzz -fill \#FC0D1B +opaque $K                  \
-flip                                            \
-pointsize %[fx:.282*min\(u[0].w,u[0].h\)]       \
-fill white -draw 'gravity center text 0,0 "-1"' \
x:

Entradas y salidas

Estoy obteniendo una respuesta bastante diferente para la imagen dennis, probablemente porque el "-fuzz" de ImageMagick calcula una esfera con un diámetro de 2N unidades en coordenadas rgb, mientras que las reglas requieren calcular un cubo con lados de 101 unidades en coordenadas rgb. Variar la "pelusa" ayudó a algunos. Además, los artefactos JPEG en el original parecen estar interfiriendo con la conversión.

Glenn Randers-Pehrson
fuente
No estoy familiarizado con imageMagick, por lo que esto puede ser muy inculto, pero ¿puede reemplazar el código de color # 0000 con simplemente # 0?
tuskiomi el
No, el # 0 no funciona. Tampoco # 000 porque es negro opaco y necesitamos negro transparente aquí.
Glenn Randers-Pehrson el
El error que mencioné # ImageMagick 7.0.1 through 7.0.3-7 fails herese informó a los desarrolladores de mensajería instantánea y se reparó en la versión 7.0.3-8.
Glenn Randers-Pehrson el
10

C, Windows de 32 bits, 987 bytes

#include <windows.h>
#define A CreateCompatibleDC(c)
#define F z=GetPixel(d,x,y);r=z;g=z>>8;b=z>>16
#define C(X,Y) (X<0||Y<0||X>=s[2]||Y>=s[3]||!GetPixel(e,X,Y))
#define D ((C(x-1,y)||C(x+1,y)||C(x,y-1)||C(x,y+1))&&!C(x,y))
#define E(X,Y) ((Z+X-Y)*(Z+X-Y)<2501)
main(int a,int*n){HDC c,d,e,f,w;int x,y,s[9],z,*o,m,t,Z;unsigned char r,g,b,R,G,B;c=GetDC(w=GetDesktopWindow());d=A;e=A;SelectObject(d,f=LoadImage(0,n[1],0,0,0,16));SelectObject(e,LoadImage(0,n[2],0,0,0,16));GetObject(f,24,s+1);o=LocalAlloc(64/*Fixed,ZeroInit*/,8*s[2]*s[3]);for(x=t=Z=s[1]=s[0]=0;x<s[2];x++)for(y=0;y<s[3];y++)if D{F;for(m=0;m<t&&o[m]!=z;m+=2);o[m]=z;o[m+1]++;t+=2*(m>=t);}for(x=y=1;x<t;x+=2)if(o[x]>o[y])y=x;z=o[y-1];R=z;G=z>>8;B=z>>16;for(x=0;x<s[2];x++)for(y=0;y<s[3];y++){F;SetPixel(c,x,s[3]-y-1,(C(x,y)||(E(r,R)&&E(g,G)&&E(b,B)))?0x232323:0x1B0DFC);}SelectObject(c,CreateFont(-(s[2]>>2),0,0,0,400,0,0,0,0,0,0,0,0,"Arial"));SetBkMode(c,1);SetTextColor(c,0xFFFFFF);DrawText(c,"-1",2,s,37);ReleaseDC(w,c);}
  • El archivo se guarda con LF como final de línea, no con CR + LF para guardar algunos bytes.
  • El programa está escrito de manera que se generan advertencias del compilador para guardar algunos bytes más.
  • El archivo probablemente no se compilará como un programa de 64 bits porque la matriz "s[] " se usa para hacer algunos cambios implícitos ...
  • El programa toma dos imágenes (los nombres de archivo se dan a través de la línea de comando):
    • La primera imagen (primer argumento de línea de comando) es la imagen R / G / B en formato .BMP de Windows
    • La segunda imagen es el canal Alfa (negro significa: 0%, cualquier otro color significa: no 0%); el archivo también está en formato .BMP y debe tener el mismo tamaño o ser más grande que la primera imagen
  • La imagen de salida se muestra en la esquina superior izquierda de la pantalla.
  • No pude reproducir al niño con el pelo amarillo. ¡El amarillo parece estar demasiado lejos (> 50) del blanco!

Versión sin golf:

#include <windows.h>

/*
 * Although this line costs us 32 bytes
 * Replacing "CreateCompatibleDC(c)" we'll
 * save 42 bytes in the golfed version later
 * so we save 10 bytes using this define!
 */
#define A CreateCompatibleDC(c)

/*
 * Macro: Get a pixel value at (x,y) to z
 * Also get r, g, b
 */
#define F z=GetPixel(d,x,y); \
    r=z; \
    g=z>>8; \
    b=z>>16

/*
 * Macro checking if a pixel is a
 * transparent colour or lies outside the
 * image
 */
#define C(X,Y) (X<0 || Y<0 || X>=s[2] || Y>=s[3] || !GetPixel(e,X,Y))

/*
 * Macro checking if a pixel at (x,y) is a border pixel
 */
#define D ((C(x-1,y) || C(x+1,y) || C(x,y-1) || C(x,y+1)) && !C(x,y))

/*
 * Macro checking if the difference between X and Y is less than 50
 * The variable "Z" must be type "int" and zero. It is used to
 * perform an implicit cast from "BYTE" to "int".
 */
#define E(X,Y) ((Z+X-Y)*(Z+X-Y)<2501)

/*
 * Note that the second argument is "char **",
 * not "int *".
 * We ignore resulting compiler warnings...
 */
main(int a, int * n)
{
    HDC c, d, e, f, w;
    int x, y, s[9], z, *o, m, t, Z;
    unsigned char r, g, b, R, G, B;

    /*
     * Get the HDC handle to the
     * screen (allowing us to create HDCs
     * for accessing bitmap files as well as
     * drawing directly to the screen!)
     */
    c=GetDC(w=GetDesktopWindow());
    /*
     * Create two virtual HDCs for accessing
     * the bitmap files.
     */
    d=A; /* Macro */
    e=A; /* Macro */
    /*
     * Load the two images:
     * The first argument is the image file with
     * the R/G/B channel
     * The second argument is the image file
     * containing the mask defined by the Alpha
     * channel:
     *   Black means = Alpha=0
     *   White means = Alpha>0
     *   (Any other colour means: Alpha>0)
     *
     * Note that "f" is of the type "HBITMAP",
     * not "HDC". We save 4 bytes in the golfed
     * version using HDC instead of HBITMAP and
     * compile the C file with compiler warnings
     * switched off!
     *
     * The second image should have the same size
     * as the first one. However it may be larger
     * than the first one. It must not be smaller!
     */
    SelectObject(d,f=LoadImage(0,n[1],0,0,0,16 /* 16=LR_LOADFROMFILE */));
    SelectObject(e,LoadImage(0,n[2],0,0,0,16));
    /*
     * Get the image information (size)
     */
    GetObject(f,24,s+1);
    /*
     * Search all background colours
     */
    o=LocalAlloc(64 /* Fixed, ZeroInit */,8*s[2]*s[3]);
    for(x=t=Z=s[1]=s[0]=0;x<s[2];x++)
        for(y=0;y<s[3];y++)
            if D
    {
        F; /* Macro */
        for(m=0;m<t && o[m]!=z;m+=2);
        o[m]=z;
        o[m+1]++;
        t+=2*(m>=t);
    }
    /*
     * Search the most common one
     */
    for(x=y=1;x<t;x+=2) if(o[x]>o[y]) y=x;
    z=o[y-1];
    R=z;
    G=z>>8;
    B=z>>16;
    /*
     * Draw the image directly to the screen
     */
    for(x=0;x<s[2];x++)
        for(y=0;y<s[3];y++)
    {
        F; /* Macro */
        /* C and E are macros: */
        SetPixel(c,x,s[3]-y-1,(C(x,y) ||
            (E(r,R) && E(g,G) && E(b,B)))?
            0x232323:0x1B0DFC);
    }
    /*
     * Draw the text over the image
     */
    SelectObject(c,CreateFont(-(s[2]>>2),0,0,0,400,0,0,0,0,0,0,0,0,"Arial"));
    SetBkMode(c,1 /* TRANSPARENT */);
    SetTextColor(c,0xFFFFFF);
    DrawText(c,"-1",2,s,37 /* center, vcenter, singleline */);
    /*
     * Unfortunately DrawText() won't work
     * when not doing this!
     */
    ReleaseDC(w,c);
}
Martin Rosenau
fuente