Downgoat-ify Animals!


25

Il mio avatar di Downgoat ha diverse caratteristiche distinte

Queste caratteristiche possono tuttavia applicarsi anche a qualsiasi altro animale.

specificazione

Data l'immagine di un animale (tecnicamente può essere qualsiasi cosa), è necessario applicare le proprietà Downgoat ad esso.

I pixel del bordo sono la maggior parte dei pixel esterni dell'immagine.

Il colore di sfondo è definito come il colore più comune nei pixel del bordo. Quando quel colore viene interpretato come un colore (r, g, b, a), con ciascun canale da [0, 256), lo sfondo viene definito come l'area in cui ciascun canale dei pixel dati è entro 50 " colore di sfondo".

Il processo:

  • Impostando lo sfondo e tutti i pixel trasparenti su #232323,RGBA(35, 35, 35, 1.00)
  • Impostare tutti i pixel che non sono lo sfondo #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Riflettere verticalmente l'immagine
  • Aggiungi il testo -1in carattere Arial, al centro dell'immagine. L'altezza totale del testo dovrebbe essere il 25% della dimensione più piccola dell'immagine (cioè min(width, height) * 0.25).

Regole

  • Sentiti libero di presumere che i caratteri siano già installati
  • La tua soglia dovrebbe essere 50, tuttavia puoi prendere questo numero anche come input. Tu non si ottiene alcun diminuito di byte conta nulla per fare questo però
  • Fare riferimento alle impostazioni predefinite I / O delle immagini per qualsiasi domanda relativa ai formati I / O.
  • L'immagine avrà sempre una dimensione di almeno 3x3
  • Se non esiste un "colore del pixel del bordo" più comune, non importa quale colore del pixel del bordo viene utilizzato come "colore di sfondo", tuttavia deve essere coerente.

Esempi

Ingresso: Capra

Produzione: Downgoat


Ingresso: Calamaro

Produzione: Downsquid

Ingresso: Downgoat

Produzione: Downdowngoat


Ingresso: Dennis

Produzione: Downdennis


Ingresso: Trichoplax

Produzione: Downtrichoplax


Altri esempi?

Un'implementazione online è disponibile qui: vihan.org/p/downgoatify/#50


Questo è quindi vince il codice più breve in byte. In bocca al lupo!


6
-1 Il primo caso di test non è un animale -_-
Geobits il

10
-1ˢᵗ caso di test non è neanche un animale.
Adám,

8
Non è un fan del demone dennis
downrep_nation

1
Potresti eliminare la preoccupazione se si tratta di un animale cambiando "animale" in "avatar" nel titolo e in tutta la domanda.
Glenn Randers-Pehrson,

4
Qual è lo scopo di far applicare il font? L'unica cosa che fa è penalizzare le lingue in cui la modifica del carattere richiede più byte
Fatalizza il

Risposte:


9

ImageMagick 7.0.3 + bash + sed, 379 byte

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:

Ungolfed

# 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:

Ingressi e uscite

Sto ottenendo una risposta alquanto diversa per l'immagine di Dennis, probabilmente perché la "-fuzz" di ImageMagick calcola una sfera con diametro di unità 2N in coordinate rgb mentre le regole richiedono il calcolo di un cubo con lati di 101 unità in coordinate rgb. Variare il "fuzz" ha aiutato alcuni. Inoltre, i manufatti JPEG nell'originale sembrano interferire con la conversione.


Non ho familiarità con imageMagick, quindi questo può essere molto poco istruito, ma puoi sostituire il codice colore # 0000 con semplicemente # 0?
tuskiomi,

No, # 0 non funziona. Nemmeno # 000 perché è nero opaco e qui abbiamo bisogno di nero trasparente.
Glenn Randers-Pehrson,

Il bug che ho citato # ImageMagick 7.0.1 through 7.0.3-7 fails hereè stato segnalato agli sviluppatori di messaggistica istantanea ed è stato corretto nella versione 7.0.3-8.
Glenn Randers-Pehrson,

10

C, Windows a 32 bit, 987 byte

#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);}
  • Il file viene salvato con LF come fine riga, non con CR + LF per salvare alcuni byte.
  • Il programma è scritto in modo che vengano generati avvisi del compilatore per salvare qualche byte in più.
  • Il file probabilmente non verrà compilato come programma a 64 bit poiché l'array " s[]" viene utilizzato per eseguire alcuni casting impliciti ...
  • Il programma prende due immagini (i nomi dei file sono dati dalla riga di comando):
    • La prima immagine (primo argomento della riga di comando) è l'immagine R / G / B in formato Windows .BMP
    • La seconda immagine è il canale alfa (il nero significa: 0%, qualsiasi altro colore significa: non 0%); il file è anche in formato .BMP e deve avere le stesse dimensioni o essere più grande della prima immagine
  • L'immagine in uscita viene visualizzata nell'angolo in alto a sinistra dello schermo
  • Non riuscivo a riprodurre il ragazzo con i capelli gialli. Il giallo sembra essere troppo lontano (> 50) dal bianco!

Versione non golfata:

#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);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.