GD Kütüphanesi ile bir görüntü tonlamal yapma

6 Cevap php

Benim görevim, size bir resim yükleyebilirsiniz küçük bir uygulama oluşturmak için, ve app ASCII sanatı haline dönecek. Ben bu zaten var eminim ama ben bunu kendim yapabilirim kanıtlamak istiyorum.

Bu, bir görüntü alarak o tonlama yapma ve daha sonra resim nasıl karanlık ve ne kadar dolu karakter olarak bir karakteri ile her pikseli eşleşen içerecektir.

Yani benim soru GD Kütüphane kullanarak, bir (veya gerekirse ben başka bir yöntem sanırım) nasıl siyah beyaz bir resim yapabilirim?

6 Cevap

Gri tonlama, RGB dönüştürmek için ortak bir formül:

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

nickf de işaret ettiği gibi, onun comment, basit bir formül (pixel.r + pixel.g + pixel.b) / 3 doğru değil. Yerine GD-dahil fonksiyonunu imagefilter() (PHP kullanarak bir görüntüdeki bütün pikselleri üzerinde yinelemek gerek döngüler) kullanın:

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

(Yazdığın gibi) tamamen siyah ve beyaz yapmak için kullanabilirsiniz

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

Nickf gelen cevabı oldukça yaygın olmasına rağmen, yanlış. (Özür dilerim, Nick.) Yeni başlayanlar için, bu görüntüleri kullanmak Bilgisayarın ne olduğunu NTSC RGB değil, sRGB, için parlaklık sayılardır. Doğru sayılar 0.21, 0.72, 0.07 vardır. İkinci olarak, ağırlıklar daha sonra gama düzeltmesi yeniden uygulanan, un-gamma-düzeltilmiş RGB değerlerine uygulanması gerekir. SRGB için Gamma, yaklaşık 2.2 olduğunu. Doğrusu, 1/2.2 tarafından üs yaklaşan bir kompozit fonksiyonudur. İşte C + + olduğunu. (Ben php bilmiyorum. Üzgünüz, çevirmek gerekir.)

// 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)
    );
}

Sen sonuç sadece bir piksel sen yapmış olurdu ki, (sizin durumda gri noktalar serisi) belli bir renk ne kadar yakın hesaplanmış ise aynı olurdu ... o gri tonlamaya dönüştürmek zorunda değilsiniz senin gri tonlu bir görüntü karşılaştırırken zaten, ve sonra uygun karakter seçilmesi.

Tipik bir RGB renk uzayında, her renk bileşeni (RG ve B) için 128 değeri orta gri verecektir. Siz de gri farklı yoğunluklarda (tonları) almak için 128 daha herhangi bir değer daha düşük ya da daha yüksek koymak olabilir.

-AD