Downgoat-ify Animals!

25

Mój awatar Downgoat ma kilka wyraźnych cech

Te cechy mogą jednak dotyczyć także każdego innego zwierzęcia.

Specyfikacja

Biorąc pod uwagę obraz zwierzęcia (technicznie może być dowolny), musisz zastosować do niego właściwości Downgoat.

Piksele graniczne to najbardziej zewnętrzne piksele obrazu.

Kolor tła jest zdefiniowany jako najczęstszą koloru pikseli granicznych. Gdy ten kolor jest interpretowany jako kolor (r, g, b, a), dla każdego kanału z [0, 256), tło jest definiowane jako obszar, w którym każdy kanał danych pikseli mieści się w granicach 50 „ kolor tła".

Proces:

  • Ustawienie tła i wszystkich przezroczystych pikseli na #232323,RGBA(35, 35, 35, 1.00)
  • Ustaw wszystkie piksele, które nie są tłem do #FC0D1B, RGBA(252, 13, 27, 1.00).
  • Odbij pionowo obraz
  • Dodaj tekst -1czcionką Arial na środku obrazu. Całkowita wysokość tekstu powinna wynosić 25% najmniejszego wymiaru obrazu (tj min(width, height) * 0.25.).

Zasady

  • Załóż, że czcionki są już zainstalowane
  • Twój próg powinien być 50, ale możesz również wziąć tę liczbę jako dane wejściowe. Zdajesz nie dostać żadnego zmniejszoną byte count cokolwiek robi to jednak na
  • W przypadku pytań związanych z formatami We / Wy zapoznaj się z naszymi wartościami domyślnymi We / Wy obrazu .
  • Obraz zawsze będzie miał rozmiar co najmniej 3 x 3
  • Jeśli nie ma najpopularniejszego „koloru piksela obramowania”, nie ma znaczenia, którego koloru piksela obramowania użyjesz jako „koloru tła”, musi to jednak być spójne.

Przykłady

Wkład: Koza

Wydajność: Downgoat


Wkład: Kałamarnica

Wydajność: Downsquid

Wkład: Downgoat

Wydajność: Downdowngoat


Wkład: Dennis

Wydajność: Downdennis


Wkład: Trichopaks

Wydajność: Downtrichoplax


Więcej przykładów?

Implementacja online jest dostępna tutaj: vihan.org/p/downgoatify/#50


To jest więc wygrywa najkrótszy kod w bajtach. Powodzenia!

Downgoat
źródło
6
-1 Pierwszy przypadek testowy nie jest zwierzęciem -_-
Geobits
10
-1ˢᵗ przypadek testowy też nie jest zwierzęciem.
Adám
8
Nie jest fanem demona
dennisa
1
Możesz wyeliminować obawy o to, czy jest to zwierzę, zmieniając „zwierzę” na „awatar” w tytule i w całym pytaniu.
Glenn Randers-Pehrson
4
Po co wymuszać użycie czcionki? Jedyne, co robi, to karanie języków, w których zmiana czcionki zajmuje więcej bajtów
Fatalize

Odpowiedzi:

9

ImageMagick 7.0.3 + bash + sed, 379 bajtów

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:

Nie golfił

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

Wejścia i wyjścia

Dostaję zupełnie inną odpowiedź na obraz dennisa, prawdopodobnie dlatego, że „-fuzz” ImageMagicka oblicza kulę o średnicy 2N jednostek we współrzędnych rgb, podczas gdy reguły wymagają obliczania sześcianu o bokach 101 jednostek we współrzędnych rgb. Różnicowanie „fuzz” pomogło niektórym. Również artefakty JPEG w oryginale wydają się zakłócać konwersję.

Glenn Randers-Pehrson
źródło
Nie znam się na imageMagick, więc może to być bardzo niewykształcone, ale czy możesz zastąpić kod koloru # 0000 po prostu numerem 0?
tuskiomi
Nie, nr 0 nie działa. Nie # 000, ponieważ jest to nieprzezroczysta czerń i potrzebujemy tutaj przezroczystej czerni.
Glenn Randers-Pehrson
Błąd, o którym wspomniałem, # ImageMagick 7.0.1 through 7.0.3-7 fails herezostał zgłoszony twórcom komunikatorów internetowych i został naprawiony w wersji 7.0.3-8.
Glenn Randers-Pehrson,
10

C, 32-bitowy system Windows, 987 bajtów

#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);}
  • Plik jest zapisywany z LF jako końcem linii, a nie z CR + LF, aby zapisać niektóre bajty.
  • Program jest napisany w taki sposób, że generowane są ostrzeżenia kompilatora, aby zaoszczędzić trochę więcej bajtów.
  • Plik prawdopodobnie nie zostanie skompilowany jako program 64-bitowy, ponieważ tablica „ s[]” służy do wykonywania niejawnych rzutowań ...
  • Program pobiera dwa obrazy (nazwy plików są podawane z wiersza poleceń):
    • Pierwszy obraz (pierwszy argument wiersza poleceń) to obraz R / G / B w formacie Windows .BMP
    • Drugi obraz to kanał alfa (czarny oznacza: 0%, każdy inny kolor oznacza: nie 0%); plik ma również format .BMP i musi mieć ten sam rozmiar lub być większy niż pierwszy obraz
  • Obraz wyjściowy jest wyświetlany w lewym górnym rogu ekranu
  • Nie mogłem odtworzyć chłopca z żółtymi włosami. Żółty wydaje się być zbyt daleko (> 50) od białego!

Wersja bez golfa:

#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
źródło