Abandonnez les animaux!

25

Mon avatar Downgoat a plusieurs fonctionnalités distinctes

Ces caractéristiques peuvent cependant également s'appliquer à tout autre animal.

spécification

Étant donné l'image d'un animal (techniquement, cela peut être n'importe quoi), vous devez lui appliquer les propriétés Downgoat.

Les pixels de bordure sont les pixels les plus externes de l'image.

La couleur d'arrière-plan est définie comme la couleur la plus courante dans les pixels de bordure. Lorsque cette couleur est interprétée comme une couleur (r, g, b, a), avec chaque canal de [0, 256), l'arrière-plan est défini comme la zone où chaque canal des pixels donnés "se trouve à moins de 50" Couleur de fond".

Le processus:

  • Définir l'arrière-plan et tous les pixels transparents sur #232323,RGBA(35, 35, 35, 1.00)
  • Définir tous les pixels qui ne sont pas à l'arrière - plan #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Refléter verticalement l'image
  • Ajoutez le texte -1en police Arial, au centre de l'image. La hauteur totale du texte doit correspondre à 25% de la plus petite dimension de l'image (c. min(width, height) * 0.25-à-d.).

Règles

  • N'hésitez pas à supposer que les polices sont déjà installées
  • Votre seuil est censé être 50, mais vous pouvez également prendre ce nombre en entrée. Vous ne pas aucune diminution du nombre d'octets pour cela
  • Reportez-vous à nos images par défaut d'E / S pour toute question relative aux formats d'E / S.
  • L'image sera toujours au moins 3 x 3
  • S'il n'y a pas de "couleur de pixel de bordure" la plus courante, peu importe la couleur de pixel de bordure que vous utilisez comme "couleur d'arrière-plan", cela doit cependant être cohérent.

Exemples

Contribution: Chèvre

Sortie: Downgoat


Contribution: Calamar

Sortie: Downsquid

Contribution: Downgoat

Sortie: Downdowngoat


Contribution: Dennis

Sortie: Downdennis


Contribution: Trichoplax

Sortie: Downtrichoplax


Plus d'exemples?

Une implémentation en ligne est disponible ici: vihan.org/p/downgoatify/#50


C'est le donc le code le plus court en octets gagne. Bonne chance!

Downgoat
la source
6
-1 Premier cas de test pas un animal -_-
Geobits
10
-1ˢᵗ cas de test pas un animal non plus.
Adám
8
Pas un fan de démon dennis
downrep_nation
1
Vous pouvez éliminer le souci de savoir s'il s'agit d'un animal en remplaçant «animal» par «avatar» dans le titre et tout au long de la question.
Glenn Randers-Pehrson
4
Quel est l'intérêt d'appliquer la police à utiliser? La seule chose que cela fait est de pénaliser les langues où le changement de police prend plus d'octets
Fatalize

Réponses:

9

ImageMagick 7.0.3 + bash + sed, 379 octets

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:

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

Entrées et sorties

Je reçois une réponse assez différente pour l'image de dennis, probablement parce que "-fuzz" d'ImageMagick calcule une sphère avec un diamètre de 2N unités en coordonnées rgb tandis que les règles prévoient de calculer un cube avec des côtés de 101 unités en coordonnées rgb. Faire varier le "fuzz" a aidé certains. De plus, les artefacts JPEG de l'original semblent interférer avec la conversion.

Glenn Randers-Pehrson
la source
Je ne suis pas familier avec imageMagick, donc cela peut être très peu éduqué, mais pouvez-vous remplacer le code couleur # 0000 par simplement # 0?
tuskiomi
Non, # 0 ne fonctionne pas. Le # 000 non plus, car c'est du noir opaque et nous avons besoin de noir transparent ici.
Glenn Randers-Pehrson
Le bogue que j'ai mentionné # ImageMagick 7.0.1 through 7.0.3-7 fails herea été signalé aux développeurs de messagerie instantanée et est corrigé dans la version 7.0.3-8.
Glenn Randers-Pehrson
10

C, Windows 32 bits, 987 octets

#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);}
  • Le fichier est enregistré avec LF comme fin de ligne, pas avec CR + LF pour enregistrer certains octets.
  • Le programme est écrit de manière à ce que les avertissements du compilateur soient générés pour économiser encore plus d'octets.
  • Le fichier ne sera probablement pas compilé en tant que programme 64 bits car le tableau " s[]" est utilisé pour effectuer des transtypages implicites ...
  • Le programme prend deux images (les noms de fichiers sont donnés via la ligne de commande):
    • La première image (premier argument de ligne de commande) est l'image R / G / B au format Windows .BMP
    • La deuxième image est le canal Alpha (noir signifie: 0%, toute autre couleur signifie: pas 0%); le fichier est également au format .BMP et doit avoir la même taille ou être plus grand que la première image
  • L'image de sortie s'affiche dans le coin supérieur gauche de l'écran
  • Je n'ai pas pu reproduire le garçon aux cheveux jaunes. Le jaune semble trop éloigné (> 50) du blanc!

Version non golfée:

#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
la source