PHP를 사용하여 이미지를 처리 할 때 imageColorResolve () 는 매우 실용적인 기능이며 그 기능입니다. 정확히 일치하는 색상이 발견되면 색 인덱스가 반환됩니다. 찾을 수없는 경우 가장 가까운 색상의 색인이 반환됩니다. 이는 팔레트 기반 이미지 (예 : GIF 형식)를 만들 때 매우 중요합니다.
그러나 imageColorResolve () 의 성능은 색상 조회 알고리즘 의 영향을 크게받습니다. 이것은 이미지 처리 프로그램을 최적화하는 데 특히 중요합니다.
imageColorResolve ()가 호출되면 PHP의 논리는 대략입니다.
이미지 팔레트의 모든 색상을 반복하십시오.
각 색상과 대상 색상 사이의 "거리"를 계산하십시오.
가장 작은 거리의 색상을 찾고 색인을 반환하십시오.
거리의 계산은 일반적으로 다음과 같은 유클리드 거리 공식을 기반으로합니다.
$distance = sqrt(
pow($r1 - $r2, 2) +
pow($g1 - $g2, 2) +
pow($b1 - $b2, 2)
);
여기서 $ r1/$ g1/$ b1 은 팔레트 색상의 RGB 값 이고 $ r2/$ g2/$ b2는 원하는 대상 색상입니다.
전체 팔레트를 가로 지르기 때문에 팔레트가 클수록 성능 오버 헤드가 커지고 속도가 느려집니다.
두 가지 주요 병목 현상이 있습니다.
전체 트래버스 : 모든 검색에는 가속 메커니즘없이 모든 팔레트 색상을 스캔해야합니다.
계산량은 큽니다 . 각 색상에는 여러 첨가물, 뺄셈, 곱셈, 제곱 작업이 필요 하며이 부동 소수점 작업 자체는 비교적 CPU 소비입니다.
팔레트에 16 개의 색상이있는 경우 성능 영향이 느껴지지 않을 수 있습니다. 그러나 256 개의 색상 또는 1000 개 이상의 색상이 있으면 ImageColorResolve () 의 실행 시간이 크게 증가합니다.
수많은 작은 이미지 (예 : 검증 코드 및 동적 아이콘 생성)를 동적으로 생성하는 일부 웹 사이트에서는 부적절한 사용이 성능 병목 현상이 될 수 있습니다.
예를 들어 다음과 같은 일반적인 예입니다.
$image = imagecreate(200, 200);
for ($i = 0; $i < 1000; $i++) {
$color = imagecolorresolve($image, rand(0,255), rand(0,255), rand(0,255));
imagesetpixel($image, rand(0,199), rand(0,199), $color);
}
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
이 예에서는 Rand () 에 의해 생성 된 색상이 imageColorResolve ()를 사용하여 기존 팔레트를 통해 검색 될 때마다마다. $ I가 증가함에 따라 프로그램이 느려지고 느려집니다.
팔레트 크기 제한 : 가능하면 이미지 팔레트를 가능한 한 작게 유지하면 256 색을 초과하지 않는 것이 가장 좋습니다.
사전 할당 색상 : imageColorAllocate ()를 사용하여 자주 검색을 피하기 위해 일반적으로 사용되는 색상을 수동으로 할당하십시오.
대신 True Color Images를 사용하십시오 : 팔레트를 사용할 필요가 없다면 ( imageCreatetRueColor ()를 사용하여 진정한 색상 이미지를 생성하면 검색없이 RGB 값을 직접 사용합니다.
캐시 색상 색인 : 해시 테이블과 같은 색상 색인 캐시를 유지하여 imagecolorresolve ()에 대한 반복 호출을 피할 수 있습니다.
예를 들어:
$colorCache = [];
function resolveColorCached($image, $r, $g, $b) {
global $colorCache;
$key = "$r,$g,$b";
if (!isset($colorCache[$key])) {
$colorCache[$key] = imagecolorresolve($image, $r, $g, $b);
}
return $colorCache[$key];
}
이런 식으로 같은 색상을 재사용 할 때 속도가 훨씬 빠릅니다.
imageColorResolve () 는 매우 유용하지만 잠재적으로 성능에 민감한 기능입니다. 검색 알고리즘은 간단한 무차별 선형 스캔 + 유클리드 거리 계산으로 팔레트가 클 때 프로그램이 크게 느려집니다. 이를 이해하면 팔레트 크기를 제한하거나 캐시 검색 결과를 제한하거나 실제 색상 다이어그램을 직접 사용하여 성능을 최적화 할 수 있습니다.