2013-07-19 1 views
0

동일한 이미지 (및 다른 형식으로 복사본)의 크기가 조정 된 복사본을 감지하기 위해 이미지 파일의 지문을 계산하는 간단한 스크립트 작업을하고 있습니다.매트릭스로 PHP로 gd 이미지 리소스에 액세스

는, 이것은 (이것은 무엇에주의를 지불하지 마십시오하지
function image_chksum (&$src_image, $x1, $y1, $x2, $y2) { 
     $chksum = 0; 
     for ($x = $x1; $x < $x2; $x++) 
       for ($y = $y1; $y < $y2; $y++) { 
         $rgb = imagecolorsforindex ($src_image, imagecolorat($src_image, $x, $y)); 
         $sum = ($rgb["red"] + $rgb["green"] + $rgb["blue"] + $rgb["alpha"]); 
         $chksum += $sum; 
       } 
     return $chksum; 
} 

: 모든 것은 내가 이런 imagecolorat()를 사용하여 이미지의 모든 단일 픽셀을 읽을 필요가 이미지의 색상 값에 액세스하는 것을 제외하고, 꽤 잘 작동 전체 알고리즘, 단지 예일뿐입니다)

그래서. 이 추한 코드를 보면서 질문이 나옵니다 - 저는 단지 gd 이미지 리소스 (제 경우는 $src_image)에 액세스하여 배열 또는 일부로 사용할 수 있습니까? 이 방법은 PIL/PILLOW를 사용하여 파이썬에서 작동하는 것을 보아 왔습니다.

이 문제는 알파 PNG 이미지를 확인할 때도 나타납니다. 불행히도 여기에 설명 된 방법은 : How to check a PNG for grayscale/alpha color type? 트루 컬러가 아닌 이미지에서는 작동하지 않으므로 모든 단일 픽셀을 다시 검사해야합니다. 투명도는 일반적으로 단일 픽셀이 아닌 영역에서 사용되기 때문에 마음에 들지 않는 아이디어는 모든 N 번째 픽셀을 확인하는 것입니다.하지만 이는 매우 냉담합니다.

답변

0

QB extension은 귀하가 찾고있는 해결책 일 수 있습니다. 이를 통해 다차원 배열로 GD 이미지에 액세스 할 수 있습니다. 더 편리한 지에 따라 이미지를 uint8 [4]의 배열로 선언 할 수 있습니다. 각 픽셀은 4 개의 8 비트 정수 배열 또는 float32 [4] 배열입니다. 각 픽셀은 4 개의 32 비트 부동 소수점 숫자 배열 (0에서 1 사이의 값 포함)

성능은 일반 PHP보다 적어도 1 배 이상 우수해야합니다. 네이티브 컴파일을 사용하면 코드가 5 배 빠르게 실행됩니다.