0

2 つの色を生成する小さなスクリプトを作成しようとしています。1 つを背景として使用し、もう 1 つをフォントの色として使用すると、次のガイドラインに従って読み取り可能になります。

http://www.hgrebdes.com/colour/spectrum/colourvisibility.html

W3C の Web アクセシビリティ ガイドライン (そして不十分)

色の可視性は、次のアルゴリズムに従って決定できます。

(これは提案されたアルゴリズムであり、まだ変更の余地があります。)

2 色の明度差と色差が設定範囲よりも大きい場合、2 色は良好な色の視認性を提供します。

色の明るさは次の式で決定されます: ((赤の値 X 299) + (緑の値 X 587) + (青の値 X 114)) / 1000 注: このアルゴリズムは、RGB 値を YIQ 値に変換する式から取得されます。この明るさの値は、色の知覚される明るさを示します。

色差は次の式で決定されます: (最大 (赤の値 1、赤の値 2) - 最小 (赤の値 1、赤の値 2)) + (最大 (緑の値 1、緑の値 2) - 最小 (緑の値 1) 、緑の値 2)) + (最大 (青の値 1、青の値 2) - 最小 (青の値 1、青の値 2))

色の明るさの差の範囲は 125 です。色の差の範囲は 500 です。

私のコードは次のとおりです。

do {

    $bg[0] = rand(0, 255);
    $bg[1] = rand(0, 255);
    $bg[2] = rand(0, 255);
    $bg[3] = ($bg[0] + $bg[1] + $bg[2])/1000;

    $txt[0] = rand(0, 255);
    $txt[1] = rand(0, 255);
    $txt[2] = rand(0, 255);
    $txt[3] = ($txt[0] + $txt[1] + $txt[2])/1000;

    //Brightness Difference = Brightness of color 1 - Brightness of color 2
    $brightnessDifference = abs($bg[3] - $txt[3]);

    //Color difference = Maximum (Red1, Red2) - Minimum (Red1, Red2) etc for Blue and Green
    $colorDifference = max($bg[0], $txt[0]) - min($bg[0], $txt[0]) + max($bg[1], $txt[1]) - min($bg[1], $txt[1]) + max($bg[2], $txt[2]) - min($bg[2], $txt[2]);
} while($brightnessDifference < 125 || $colorDifference < 500)

しかし、実行時間は PHP で許可されている時間を超えています...最適化する方法についての提案はありますか? :)

4

1 に答える 1

1

スクリプトの実行時間が長くなり、スクリプトの最大実行時間を超える無限ループを引き起こすバグがあります。

コード内の次の 3 行はバグがあります。

$bg[3] = ($bg[0] + $bg[1] + $bg[2])/1000;
$txt[3] = ($txt[0] + $txt[1] + $txt[2])/1000;
$brightnessDifference = abs($bg[3] - $txt[3]);

$brightnessDifference125 を超えることはないので、永久while()に実行されます。

あなたの質問から引用された解決策は次のとおりです。

色の明るさは次の式で決定されます: ((赤の値 X 299) + (緑の値 X 587) + (青の値 X 114)) / 1000 注: このアルゴリズムは、RGB 値を YIQ 値に変換する式から取得されます。この明るさの値は、色の知覚される明るさを示します。

最適化を求めましたが、バグを削除したら必要ありませんが、次のように変更することでコードを最適化できますrand( )

do {

    $bg[0] = rand( ) & 255;
    $bg[1] = rand( ) & 255;
    $bg[2] = rand( ) & 255;
    $bg[3] = ($bg[0] + $bg[1] + $bg[2])/1000;

    $txt[0] = rand( ) & 255;
    $txt[1] = rand( ) & 255;
    $txt[2] = rand( ) & 255;
    $txt[3] = ($txt[0] + $txt[1] + $txt[2])/1000;

    //Brightness Difference = Brightness of color 1 - Brightness of color 2
    $brightnessDifference = abs($bg[3] - $txt[3]);

    //Color difference = Maximum (Red1, Red2) - Minimum (Red1, Red2) etc for Blue and Green
    $colorDifference = max($bg[0], $txt[0]) - min($bg[0], $txt[0]) + max($bg[1], $txt[1]) - min($bg[1], $txt[1]) + max($bg[2], $txt[2]) - min($bg[2], $txt[2]);
} while($brightnessDifference < 125 || $colorDifference < 500)

実行時間を最大 30% 節約できます。

于 2013-04-28T17:13:04.287 に答える