4

私の使命は、写真をアップロードできる小さなアプリを作成することです。アプリはそれを ASCII アートに変換します。これらはすでに存在していると確信していますが、自分でできることを証明したいと思います。

これには、画像を取得してグレースケールにし、画像の暗さと文字の密度に応じて各ピクセルを文字と一致させることが含まれます。

だから私の質問は、GD ライブラリを使用して (または必要に応じて他の手段を推測します)、どうすれば画像を白黒にすることができますか?

4

6 に答える 6

23

nickfコメントで指摘されているように、単純な式(pixel.r + pixel.g + pixel.b) / 3は正しくありません。代わりに、GDに含まれる関数を使用してくださいimagefilter()(PHPループを使用して画像内のすべてのピクセルを反復処理する必要はありません)。

$im = imagecreatefrompng('dave.png');
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagepng($im, 'dave.png');
于 2008-11-10T08:24:31.857 に答える
7

(あなたが書いたように)純粋に白黒にするには、これを使用します

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -1000);
于 2010-08-23T20:48:13.453 に答える
5

nickfからの答えは、かなり一般的ですが、間違っています。(ニック、申し訳ありません。)まず、これらはNTSC RGBの光度の数値であり、コンピューター画像が使用するsRGBではありません。正しい数値は0.21、0.72、0.07です。次に、ガンマ補正されていないRGB値に重み付けを適用してから、ガンマ補正を再適用する必要があります。sRGBのガンマは約2.2です。正確には、べき乗を1/2.2で近似する複合関​​数です。これはC++です。(私はphpを話しません。申し訳ありませんが、翻訳する必要があります。)

// 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)
    );
}
于 2010-08-23T21:55:34.027 に答える
3

RGB をグレースケールに変換する一般的な式は次のとおりです。

グレースケール強度 = 0.30R + 0.59G + 0.11B
于 2008-11-10T06:04:58.677 に答える
1

グレースケールに変換する必要はありません...ピクセルが特定の色(この場合は一連のグレーポイント)にどれだけ近いかを計算した場合、結果は同じになります。とにかく、グレースケール画像を比較してから適切な文字を選択するとき。

于 2008-11-10T01:56:44.527 に答える
0

通常、RGB カラー スペースでは、各カラー コンポーネント (RG および B) の値を 128 にすると、中程度のグレーになります。128 より小さい値または大きい値を設定して、異なる強度 (色合い) のグレーを取得することもできます。

-広告

于 2008-11-10T02:17:42.377 に答える