(PECL imagick 2, PECL imagick 3)
ImagickPixel::isSimilar β ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌ ΡΠ²Π΅ΡΠΎΠΌ ΠΈ Π΄ΡΡΠ³ΠΈΠΌ
Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π»ΠΈ; Π΄Π»Ρ Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²Π° Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΈΡΠΎΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΡΠ°Π·Π½ΠΈΡΠ° ΡΠ²Π΅ΡΠ°, ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ ImagickPixel ΠΈ ΡΠ²Π΅ΡΠ° Π² ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅, ΠΏΡΡΡΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΈΡ RGB Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ²Π΅ΡΠΎΠ²ΠΎΠΌ ΠΊΡΠ±Π΅. ΠΡΠ»ΠΈ ΡΠ°Π·Π½ΠΈΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ΅ fuzz-Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΠΎ ΡΠ²Π΅ΡΠ° ΡΡΠΈΡΠ°ΡΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ. Π£ΡΡΠ°ΡΠ΅Π» Π² ΠΏΠΎΠ»ΡΠ·Ρ ImagickPixel::isPixelSimilar().
colorΠΠ±ΡΠ΅ΠΊΡ ImagickPixel Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ.
fuzzΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°Π·Π½ΠΈΡΠ°, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²Π΅ΡΠ° Π±ΡΠ΄ΡΡ ΡΡΠΈΡΠ°ΡΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ. Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠΎΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΠΉ ΠΊΠΎΡΠ΅Π½Ρ ΠΈΠ· ΡΡΡΡ (1.732).
Π€ΡΠ½ΠΊΡΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ImagickPixel::isSimilar()
<?php
// Π’Π΅ΡΡΡ Π½ΠΈΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½Ρ Ρ ΡΡΡΡΠΎΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΈ 255
// ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ
Π½Π° ΠΊΠΎΡΠ΅Π½Ρ ΠΈΠ· 3 - Π΄Π»ΠΈΠ½Ρ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ
// Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΡΠ±Π°
$root3 = 1.732050807568877;
$tests = array(
['rgb(245, 0, 0)', 'rgb(255, 0, 0)', 9 / $root3, false,],
['rgb(245, 0, 0)', 'rgb(255, 0, 0)', 10 / $root3, true,],
['rgb(0, 0, 0)', 'rgb(7, 7, 0)', 9 / $root3, false,],
['rgb(0, 0, 0)', 'rgb(7, 7, 0)', 10 / $root3, true,],
['rgba(0, 0, 0, 1)', 'rgba(7, 7, 0, 1)', 9 / $root3, false,],
['rgba(0, 0, 0, 1)', 'rgba(7, 7, 0, 1)', 10 / $root3, true,],
['rgb(128, 128, 128)', 'rgb(128, 128, 120)', 7 / $root3, false,],
['rgb(128, 128, 128)', 'rgb(128, 128, 120)', 8 / $root3, true,],
['rgb(0, 0, 0)', 'rgb(255, 255, 255)', 254.9, false,],
['rgb(0, 0, 0)', 'rgb(255, 255, 255)', 255, true,],
['rgb(255, 0, 0)', 'rgb(0, 255, 255)', 254.9, false,],
['rgb(255, 0, 0)', 'rgb(0, 255, 255)', 255, true,],
['black', 'rgba(0, 0, 0)', 0.0, true],
['black', 'rgba(10, 0, 0, 1.0)', 10.0 / $root3, true],);
$output = "<table width='100%' class='infoTable'><thead>
<tr>
<th>
Color 1
</th>
<th>
Color 2
</th>
<th>
Π’Π΅ΡΡΠΎΠ²Π°Ρ Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ * 255
</th>
<th>
ΠΡΡΡ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ
Π΄ΠΎΡΡΠ³Π°Π΅ΠΌΠΎΡΡΠΈ
</th>
</tr>
</thead>";
$output .= "<tbody>";
foreach ($tests as $testInfo) {
$color1 = $testInfo[0];
$color2 = $testInfo[1];
$distance = $testInfo[2];
$expectation = $testInfo[3];
$testDistance = ($distance / 255.0);
$color1Pixel = new \ImagickPixel($color1);
$color2Pixel = new \ImagickPixel($color2);
$isSimilar = $color1Pixel->isPixelSimilar($color2Pixel, $testDistance);
if ($isSimilar !== $expectation) {
echo "Π’Π΅ΡΡ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΈ ΠΏΡΠΎΠ²Π°Π»Π΅Π½. Π¦Π²Π΅Ρ [$color1] Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ Ρ [$color2] Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² Π΄ΠΈΡΡΠ°Π½ΡΠΈΡ $testDistance.".NL;
}
$layout = "<tr>
<td>%s</td>
<td>%s</td>
<td>%s</td>
<td style='text-align: center;'>%s</td>
</tr>";
$output .= sprintf(
$layout,
$color1,
$color2,
$distance,
$isSimilar ? 'Π΄Π°' : 'Π½Π΅Ρ'
);
}
$output .= "</tbody></table>";
return $output;
?>