Downgoat-ify Tiere!


25

Mein Downgoat-Avatar hat verschiedene Merkmale

Diese Merkmale können jedoch auch für jedes andere Tier gelten.

Spezifikation

Wenn Sie ein Bild eines Tieres haben (technisch kann das alles sein), müssen Sie die Downgoat-Eigenschaften darauf anwenden.

Randpixel sind die äußersten Pixel des Bildes.

Die Hintergrundfarbe wird als die häufigste Farbe in den Randpixeln definiert. Wenn diese Farbe als eine Farbe (r, g, b, a) mit jedem Kanal von [0, 256] interpretiert wird, wird der Hintergrund als der Bereich definiert, in dem sich jeder Kanal der gegebenen Pixel 'innerhalb von 50 von "" befindet. Hintergrundfarbe".

Der Prozess:

  • Einstellen des Hintergrunds und aller transparenten Pixel auf #232323,RGBA(35, 35, 35, 1.00)
  • Stellen Sie alle Pixel ein, bei denen es sich nicht um den Hintergrund #FC0D1Bhandelt RGBA(252, 13, 27, 1.00).
  • Spiegeln Sie das Bild vertikal
  • Fügen Sie den Text -1in der Schrift Arial in der Bildmitte hinzu. Die Gesamthöhe des Texts sollte 25% der kleinsten Abmessung des Bildes (dh min(width, height) * 0.25) betragen .

Regeln

  • Nehmen wir an, die Schriftarten sind bereits installiert
  • Ihre Schwelle sollte sein 50, aber Sie können diese Zahl auch als Eingabe verwenden. Sie nicht bekommen jede verringerte Byteanzahl etwas für tun dies jedoch
  • Weitere Informationen zu E / A-Formaten finden Sie in unseren Standardeinstellungen für Bild-E / A.
  • Das Bild wird immer mindestens 3x3 groß sein
  • Wenn es keine "Randpixelfarbe" gibt, spielt es keine Rolle, welche Randpixelfarbe Sie als "Hintergrundfarbe" verwenden, dies muss jedoch konsistent sein.

Beispiele

Eingang: Ziege

Ausgabe: Downgoat


Eingang: Tintenfisch

Ausgabe: Downsquid

Eingang: Downgoat

Ausgabe: Downdowngoat


Eingang: Dennis

Ausgabe: Downdennis


Eingang: Trichoplax

Ausgabe: Downtrichoplax


Mehr Beispiele?

Eine Online-Implementierung finden Sie hier: vihan.org/p/downgoatify/#50


Das ist also gewinnt der kürzeste Code in Bytes. Viel Glück!


6
-1 Erster Testfall kein Tier -_-
Geobits

10
-1ˢᵗ Testfall auch kein Tier.
Adám

8
Kein Fan von Demon
Dennis

1
Sie könnten die Sorge beseitigen, ob es sich um ein Tier handelt, indem Sie im Titel und in der gesamten Frage "Tier" in "Avatar" ändern.
Glenn Randers-Pehrson

4
Wozu soll die zu verwendende Schriftart erzwungen werden? Das einzige , was das bedeutet ist penalize Sprachen , in denen wechselnde Schrift mehr Bytes nimmt
Fatalize

Antworten:


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:

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:

Eingänge und Ausgänge

Ich bekomme eine ganz andere Antwort für das Dennis-Bild, wahrscheinlich, weil ImageMagicks "-fuzz" eine Kugel mit einem Durchmesser von 2N Einheiten in RGB-Koordinaten berechnet, während die Regeln die Berechnung eines Würfels mit Seiten von 101 Einheiten in RGB-Koordinaten vorschreiben. Das Variieren des "Flaums" hat einigen geholfen. Außerdem scheinen die JPEG-Artefakte im Original die Konvertierung zu stören.


Ich bin nicht vertraut mit imageMagick, daher mag dies sehr ungebildet sein, aber können Sie den # 0000-Farbcode einfach durch # 0 ersetzen?
Tuskiomi

Nein, # 0 funktioniert nicht. # 000 auch nicht, weil das undurchsichtiges Schwarz ist und wir hier transparentes Schwarz brauchen.
Glenn Randers-Pehrson

Der von mir erwähnte Fehler wurde # ImageMagick 7.0.1 through 7.0.3-7 fails hereden IM-Entwicklern gemeldet und in Version 7.0.3-8 behoben.
Glenn Randers-Pehrson

10

C, 32-Bit-Windows, 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);}
  • Die Datei wird mit LF als Zeilenende gespeichert, nicht mit CR + LF, um einige Bytes zu speichern.
  • Das Programm ist so geschrieben, dass Compiler-Warnungen generiert werden, um weitere Bytes zu sparen.
  • Die Datei wird wahrscheinlich nicht als 64-Bit-Programm kompiliert, da das Array " s[]" für einige implizite Castings verwendet wird ...
  • Das Programm nimmt zwei Bilder auf (Dateinamen werden über die Befehlszeile angegeben):
    • Das erste Bild (erstes Befehlszeilenargument) ist das R / G / B-Bild im Windows-BMP-Format
    • Das zweite Bild ist der Alpha-Kanal (Schwarz bedeutet: 0%, jede andere Farbe bedeutet: nicht 0%); Die Datei ist ebenfalls im BMP-Format und muss dieselbe Größe haben oder größer als das erste Bild sein
  • Das Ausgabebild wird in der linken oberen Ecke des Bildschirms angezeigt
  • Ich konnte den Jungen mit den gelben Haaren nicht reproduzieren. Gelb scheint zu weit (> 50) von Weiß entfernt zu sein!

Ungolfed-Version:

#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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.