이미지 처리에 PHP를 사용하면 imageColorResolve () 함수가 종종 이미지를 처리하는 장면에 나타납니다. 그러나 많은 개발자 가이 기능을 사용하면 종종 궁금합니다. ** 24 비트 (Truecolor) 이미지 및 8 비트 (팔레트) 이미지에서 동작의 차이는 무엇입니까? ** 오늘 우리는이 문제에 대해 깊이 이야기 할 것입니다.
먼저 imageColorResolve ()를 간단히 소개하겠습니다. 이 기능의 기능은 다음과 같습니다.
지정된 색상이 이미 팔레트 이미지에 존재하는지 확인하십시오. 존재하는 경우 색상을 반환하십시오. 존재하지 않으면이 색상을 팔레트에 추가하고 새 인덱스를 반환하려고합니다.
기본 사용 예제 :
<?php
// 사진을 만듭니다 8 비트 팔레트 이미지
$image = imagecreate(100, 100);
// 빨간색의 정의
$red = imagecolorresolve($image, 255, 0, 0);
// 이 색상으로 사각형을 그립니다
imagefilledrectangle($image, 10, 10, 90, 90, $red);
// 출력 이미지
header('Content-Type: image/png');
imagepng($image);
// 자원을 파괴하십시오
imagedestroy($image);
?>
여기서, 빨간색이 팔레트에 이미 존재하는 경우, imagecolorresolve ()는 기존 색상 지수를 반환합니다. 그렇지 않으면 팔레트에 자동으로 빨간색을 추가합니다.
imageCreatetRueColor () 로 24 비트 truecolor 이미지를 만들 때 이미지 자체에는 팔레트가 없습니다 . 각 픽셀은 독립적으로 RGB 색상 값을 저장할 수 있습니다.
따라서 문제는 다음과 같습니다. truecolor 이미지에서 imagecolesolve ()를 호출하면 어떻게됩니까?
대답은 다음과 같습니다.
imageColorResolve ()를 호출하더라도 PHP는 실제로 색 인덱스를 찾거나 추가하지 않지만 RGB 값 (예 : 색상 식별)에서 계산 된 정수를 반환합니다.
예를 들어:
<?php
// 사진을 만듭니다 24 조금 TrueColor 영상
$image = imagecreatetruecolor(100, 100);
// 파란색을 정의하십시오
$blue = imagecolorresolve($image, 0, 0, 255);
// 이 색상으로 사각형을 그립니다
imagefilledrectangle($image, 10, 10, 90, 90, $blue);
// 출력 이미지
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
여기 $ blue는 색인이 아닌 정수 ( 255 )입니다. 이 모드에서는 각 픽셀이 전체 RGB 정보를 별도로 저장할 수 있으므로 색상의 존재에 대해 걱정할 필요조차 없습니다.
8 비트 이미지 ( imageCreate () 로 생성)에서 이미지의 색상은 최대 256 개의 색상으로 제한됩니다.
따라서 imageColorResolve ()가 호출되면 php는 다음과 같습니다.
지정된 색상이 이미 존재하는지 확인하기 위해 전체 색상 팔레트를 반복하십시오.
존재하면 인덱스를 반환하십시오.
존재하지 않으면 팔레트에 추가하십시오 (공간이 충분한 경우).
팔레트가 가득 찬 경우 기존 색상의 색인을 지정된 색상에 가장 가까운 색인을 반환하십시오.
또한 복잡한 이미지를 처리 할 때 8 비트 이미지가 색상 왜곡이 발생하기 쉬운 이유입니다. 색상이 "근사"하기 때문입니다.
예:
<?php
$image = imagecreate(100, 100);
// 팔레트 한계를 초과하는 색상을 추가하십시오
for ($i = 0; $i < 300; $i++) {
$color = imagecolorresolve($image, rand(0,255), rand(0,255), rand(0,255));
}
// 사진을 생성하십시오,보기 위해
header('Content-Type: image/png');
imagepng($image);
// 리소스 릴리스
imagedestroy($image);
?>
위의 코드에서는 300 개의 다른 색상을 추가하려고 시도했지만 이미지에는 최대 256 개의 색상 만 있으며 초과는 "대략 일치"됩니다.
이미지 유형 | imageColorResolve () 동작 설명 |
---|---|
24 비트 truecolor | 팔레트를 사용하지 않고 색상 값 (int)을 반환합니다 |
8 비트 컬러 팔레트 이미지 | 256 색으로 제한된 색 인덱스를 찾거나 추가하십시오 |
따라서 요약하기 위해 :
24 비트 이미지에서 imageColorResolve ()는 그렇게 필요하지 않습니다. imageColorAllocate ()를 직접 사용하거나 직접 색상을 구성 할 수 있습니다.
8 비트 이미지에서는 특히 이미지 색상의 숫자와 분포를 제어해야 할 때 매우 중요합니다.
8 비트 이미지를 처리 할 때 색상 결핍을 자주 발생하는 경우 이미지를 생성하기 전에 imageCreatetRueColor () 호출을 고려한 다음 TrueColor 이미지를 필요에 따라 ImageTrueColortOpalette ()를 사용하여 팔레트 이미지로 변환하는 것을 고려할 수 있습니다. PHP는 자동으로 색상을 최적화합니다.
샘플 코드 참조 :