Downgoat-ify 동물들!


25

내 Downgoat 아바타에는 몇 가지 특징이 있습니다.

그러나 이러한 기능은 다른 동물에도 적용될 수 있습니다.

사양

동물의 이미지가 주어지면 (기술적으로 무엇이든 가능할 수 있음) 다운 고트 속성을 적용해야합니다.

테두리 픽셀 은 이미지의 가장 바깥 쪽 픽셀입니다.

배경 색상은 경계 픽셀에서 가장 흔한 색상으로 정의된다. 해당 색상이 [0, 256)의 각 채널에서 (r, g, b, a) 색상으로 해석 될 때 배경은 지정된 픽셀의 모든 채널이 " 배경색".

과정:

  • 에 배경과 모든 투명 픽셀을 설정 #232323,RGBA(35, 35, 35, 1.00)
  • 의 배경이 아닌 모든 픽셀을 설정 #FC0D1B, RGBA(252, 13, 27, 1.00).
  • 이미지를 세로로 반영
  • -1이미지 중앙에 Arial 글꼴로 텍스트 를 추가하십시오 . 텍스트의 총 높이는 이미지의 가장 작은 치수 (예 :)의 25 % 여야합니다 min(width, height) * 0.25.

규칙

  • 글꼴이 이미 설치되어 있다고 가정하십시오.
  • 임계 값은이어야 50하지만이 숫자를 입력으로 사용할 수도 있습니다. 그러나이 작업을 수행하기 위해 감소 된 바이트 수는 얻지 못합니다.
  • I / O 형식과 관련된 질문은 이미지 I / O 기본값 을 참조하십시오 .
  • 이미지 크기는 항상 3x3 이상이어야합니다.
  • 가장 일반적인 "테두리 픽셀 색상"이없는 경우 "배경 색상"으로 사용하는 테두리 픽셀 색상은 중요하지 않지만 일관성이 있어야합니다.

입력: 염소

산출: 다운 염소


입력: 오징어

산출: 다운 오징어

입력: 다운 염소

산출: 다운 다운 염소


입력: 데니스

산출: 다운 데니스


입력: 트리 쇼 락스

산출: 다운 트리 찹스


더 많은 예?

vihan.org/p/downgoatify/#50 에서 온라인 구현을 사용할 수 있습니다.


이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다. 행운을 빕니다!


6
-1 동물이 아닌 첫 번째 테스트 사례 -_-
Geobits

10
-1ˢᵗ 테스트 케이스도 동물이 아닙니다.
Adám

8
악마 데니스의 팬이
downrep_nation

1
제목과 질문 전체에서 "동물"을 "아바타"로 변경하면 동물인지 걱정할 필요가 없습니다.
글렌 데르-Pehrson

4
글꼴을 사용하도록하는 요점은 무엇입니까? 글꼴 변경에 더 많은 바이트가 필요한 언어에 불이익을주는 것은 유일합니다.
Fatalize

답변:


9

ImageMagick 7.0.3 + bash + sed, 379 바이트

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:

언 골프

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

입력 및 출력

이미지 이미지에 대해 상당히 다른 답변을 얻고 있습니다. 아마도 ImageMagick의 "퍼지"는 RGB 좌표에서 직경이 2N 단위 인 구를 계산하고 규칙은 RGB 좌표로 101 개의 단위면을 가진 큐브를 계산해야하기 때문입니다. "퍼지"를 바꾸는 것이 도움이되었습니다. 또한 원본의 JPEG 아티팩트가 변환을 방해하는 것 같습니다.


나는 imageMagick과 친숙하지 않으므로 매우 교육적이지 않을 수도 있지만 # 0000 색상 코드를 단순히 # 0으로 바꿀 수 있습니까?
tuskiomi

아니요, # 0이 작동하지 않습니다. 불투명 한 검정색이기 때문에 # 000도 마찬가지입니다. 여기서 투명한 검정색이 필요합니다.
Glenn Randers-Pehrson

내가 언급 한 버그 # ImageMagick 7.0.1 through 7.0.3-7 fails here는 IM 개발자에게보고되었으며 버전 7.0.3-8에서 수정되었습니다.
글렌 데르-Pehrson

10

C, 32 비트 Windows, 987 바이트

#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);}
  • 파일은 일부 바이트를 저장하기 위해 CR + LF가 아닌 LF를 줄 끝으로 저장합니다.
  • 이 프로그램은 더 많은 바이트를 절약하기 위해 컴파일러 경고가 생성되는 방식으로 작성되었습니다.
  • 배열 " s[]"이 (가) 일부 암시 적 캐스팅을 수행하는 데 사용 되므로 파일이 64 비트 프로그램으로 컴파일되지 않을 수 있습니다.
  • 프로그램은 두 개의 이미지를 가져옵니다 (파일 이름은 명령 줄을 통해 제공됨).
    • 첫 번째 이미지 (첫 번째 명령 줄 인수)는 Windows .BMP 형식의 R / G / B 이미지입니다.
    • 두 번째 이미지는 알파 채널입니다 (검정은 0 %, 다른 모든 색은 0 %가 아님). 파일의 크기는 .BMP이며 첫 번째 이미지와 크기가 같거나 커야합니다
  • 출력 이미지는 화면의 왼쪽 상단에 표시됩니다
  • 나는 노란 머리를 가진 소년을 재생할 수 없었습니다. 노란색이 흰색에서 너무 멀리 떨어져있는 것 같습니다 (> 50)!

언 골프 버전 :

#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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.