Downgoat-ify Animals! My Downgoat avatar has several distinct features



These features can however also apply to any other animal.

Specification

Given an image of an animal (technically can be anything), you must apply the Downgoat properties to it. 

Border pixels are the outer most pixels of the image.

The background color is defined as the most common color in the border pixels. When that color is interpreted as an (r, g, b, a) color, with each channel from [0, 256), the background is defined as the area where the every channel of the given pixels' is within 50 of the "background color".

The process:


Setting the background and all transparent pixels to #232323, RGBA(35, 35, 35, 1.00)
Set all pixels which aren't the background to #FC0D1B, RGBA(252, 13, 27, 1.00).
Vertically reflect the image
Add the text -1 in Arial font, in the center of the image. The total height of the text should be 25% of the image's smallest dimension (i.e. min(width, height) * 0.25).


Rules


Feel free to assume the fonts are already installed
Your threshold is supposed to be 50, however you can take this number as input too. You do not get any decreased byte count anything for doing this however
Refer to our image I/O defaults for any questions related to I/O formats.
Image will always be at least 3x3 in size
If there is no most common "border pixel color", it doesn't matter which border pixel color you use as the "background color", this however must be consistent.


Examples

Input: 

Output: 



Input:


Output:


Input: 

Output: 



Input: 

Output: 



Input: 

Output: 



More examples?

An online implementation is available here: vihan.org/p/downgoatify/#50



This is code-golf so shortest code in bytes wins. Good luck!
C, 32-bit Windows, 987 bytes

#include &lt;windows.h&gt;
#define A CreateCompatibleDC(c)
#define F z=GetPixel(d,x,y);r=z;g=z&gt;&gt;8;b=z&gt;&gt;16
#define C(X,Y) (X&lt;0||Y&lt;0||X&gt;=s[2]||Y&gt;=s[3]||!GetPixel(e,X,Y))
#define D ((C(x-1,y)||C(x+1,y)||C(x,y-1)||C(x,y+1))&amp;&amp;!C(x,y))
#define E(X,Y) ((Z+X-Y)*(Z+X-Y)&lt;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&lt;s[2];x++)for(y=0;y&lt;s[3];y++)if D{F;for(m=0;m&lt;t&amp;&amp;o[m]!=z;m+=2);o[m]=z;o[m+1]++;t+=2*(m&gt;=t);}for(x=y=1;x&lt;t;x+=2)if(o[x]&gt;o[y])y=x;z=o[y-1];R=z;G=z&gt;&gt;8;B=z&gt;&gt;16;for(x=0;x&lt;s[2];x++)for(y=0;y&lt;s[3];y++){F;SetPixel(c,x,s[3]-y-1,(C(x,y)||(E(r,R)&amp;&amp;E(g,G)&amp;&amp;E(b,B)))?0x232323:0x1B0DFC);}SelectObject(c,CreateFont(-(s[2]&gt;&gt;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);}



The file is saved with LF as line end, not with CR+LF to save some bytes.
The program is written in a way that compiler warnings are generated to save some more bytes.
The file will probably not compile as 64-bit program because the array "s[]" is used to do some implicit castings...
The program takes two images (file names are given via command line):


The first image (first command line argument) is the R/G/B image in Windows .BMP format
The second image is the Alpha channel (black means: 0%, any other colour means: not 0%); the file is also in .BMP format and must have the same size or be larger than the first image

The output image is displayed in the left upper corner of the screen
I couldn't reproduce the boy with the yellow hair. Yellow seems to be too far away (> 50) from white!


Ungolfed version:

#include &lt;windows.h&gt;

/*
 * 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&gt;&gt;8; \
    b=z&gt;&gt;16

/*
 * Macro checking if a pixel is a
 * transparent colour or lies outside the
 * image
 */
#define C(X,Y) (X&lt;0 || Y&lt;0 || X&gt;=s[2] || Y&gt;=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)) &amp;&amp; !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)&lt;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&gt;0
     *   (Any other colour means: Alpha&gt;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&lt;s[2];x++)
        for(y=0;y&lt;s[3];y++)
            if D
    {
        F; /* Macro */
        for(m=0;m&lt;t &amp;&amp; o[m]!=z;m+=2);
        o[m]=z;
        o[m+1]++;
        t+=2*(m&gt;=t);
    }
    /*
     * Search the most common one
     */
    for(x=y=1;x&lt;t;x+=2) if(o[x]&gt;o[y]) y=x;
    z=o[y-1];
    R=z;
    G=z&gt;&gt;8;
    B=z&gt;&gt;16;
    /*
     * Draw the image directly to the screen
     */
    for(x=0;x&lt;s[2];x++)
        for(y=0;y&lt;s[3];y++)
    {
        F; /* Macro */
        /* C and E are macros: */
        SetPixel(c,x,s[3]-y-1,(C(x,y) ||
            (E(r,R) &amp;&amp; E(g,G) &amp;&amp; E(b,B)))?
            0x232323:0x1B0DFC);
    }
    /*
     * Draw the text over the image
     */
    SelectObject(c,CreateFont(-(s[2]&gt;&gt;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);
}