Frage

Meine Mission ist es, eine kleine Anwendung zu erstellen, in dem Sie ein Bild hochladen, und die App wird es in ASCII-Kunst verwandeln. Ich bin sicher, dass diese existieren bereits, aber ich will beweisen, dass ich es selbst tun kann.

Dies würde ein Bild beinhalten nehmen, so dass es Graustufen und dann jedes Pixel mit einem Charakter passende, je nachdem, wie dunkel das Bild ist und wie voll der Charakter ist.

Also meine Frage ist, mit der GD-Bibliothek (oder ich denke, einige andere Mittel, falls erforderlich), wie kann ich ein Bild schwarz und weiß?

War es hilfreich?

Lösung

Eine gemeinsame Formel RGB zu konvertieren in Graustufen ist:

Gray scale intensity = 0.30R + 0.59G + 0.11B

Andere Tipps

Wie von Nickf in seinem Kommentar , ist die einfache Formel (pixel.r + pixel.g + pixel.b) / 3 nicht korrekt. Verwenden Sie die GD-Funktion enthalten imagefilter() (keine Notwendigkeit, alle Pixel in einem Bild iterieren PHP Loops) statt:

$im = imagecreatefrompng('dave.png');
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagepng($im, 'dave.png');

Um es rein schwarz und weiß zu machen (wie Sie geschrieben haben) verwenden diese

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);

Die Antwort von Nickf, obwohl durchaus üblich, ist falsch. (Sorry, Nick.) Für den Anfang, das sind die Leuchtkraft Zahlen für NTSC RGB, sRGB, das ist das, was Computerbilder verwenden. Die richtigen Zahlen sind 0,21, 0,72, 0,07. Zweitens müssen die Gewichtungen auf die un-gamma-korrigierten RGB-Werte angewendet werden, dann ist die Gammakorrektur wieder angewendet. Gamma für sRGB ist etwa 2,2. Genauer gesagt, ist es eine zusammengesetzte Funktion, die Potenzierung von 1 / 2,2 annähert. Hier ist es in C ++. (Ich weiß nicht php sprechen. Sorry, Sie übersetzen müssen.)

// sRGB luminance(Y) values
const double rY = 0.212655;
const double gY = 0.715158;
const double bY = 0.072187;

// Inverse of sRGB "gamma" function. (approx 2.2)
double inv_gam_sRGB(int ic) {
    double c = ic/255.0;
    if ( c <= 0.04045 )
        return c/12.92;
    else 
        return pow(((c+0.055)/(1.055)),2.4);
}

// sRGB "gamma" function (approx 2.2)
int gam_sRGB(double v) {
    if(v<=0.0031308)
        v *= 12.92;
    else 
        v = 1.055*pow(v,1.0/2.4)-0.055;
    return int(v*255+.5);
}

// GRAY VALUE
int gray(int r, int g, int b) {
    return gam_sRGB(
            rY*inv_gam_sRGB(r) +
            gY*inv_gam_sRGB(g) +
            bY*inv_gam_sRGB(b)
    );
}

Sie müssen es nicht konvertieren in Graustufen ... das Ergebnis das gleiche wäre, wenn Sie nur berechnet, wie nahe ein Pixel einer bestimmten Farbe (in Ihrem Fall eine Reihe von grauen Punkten) ist, was Sie würden sowieso getan zu haben, wenn die Graustufenbild zu vergleichen und dann das entsprechende Zeichen chosing.

Typischerweise wird in einem RGB-Farbraum, den Wert von 128 für jede Farbkomponente (RG und B) ein mittleres Grau geben. Genauso gut könnte man einen beliebigen Wert setzen niedriger oder höher als 128 unterschiedlichen Intensitäten (Schatten) Grau zu erhalten.

-AD

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top