찾다

 >  Q&A  >  본문

php - 이미지 색상 값 >> 8 & 255 이동 후 비트가 255와 같아야 하는 이유는 무엇입니까?

<코드><?php
/**
imagecolorat — 픽셀의 색상 인덱스 값을 가져옵니다.

int imagecolorat(리소스 $image, int $x, int $y)

image로 지정된 그래픽에서 지정된 위치에 있는 픽셀의 색상 인덱스 값을 반환합니다.

PHP가 GD 라이브러리 2.0 이상으로 컴파일되고 이미지가 트루컬러 이미지인 경우 이 함수는 해당 지점의 RGB 값을 정수로 반환합니다. 빨간색, 녹색, 파란색 구성요소의 값을 얻으려면 이동 및 마스킹을 사용하세요.
*/
//echo dechex(255);die;//ff 16진수 ff = 10진수 255
ini_set('display_errors', '켜기');

error_reporting(E_ALL | E_STRICT);//E_ALL: E_STRICT를 제외한 모든 오류 및 경고 정보
//E_STRICT: 코드의 최상의 상호 운용성과 향후 호환성을 보장하기 위해 코드 수정에 대한 PHP의 제안을 활성화합니다.

$im = ImageCreateFromPng("images/4.png");
//$rgb = ImageColorAt($im, 100, 100);


//교대조작 설명 https://my.oschina.net/u/435872/blog/134802,



//n비트를 왼쪽으로 이동한다는 것은 데이터에 2의 n승을 곱한다는 의미입니다. n비트를 오른쪽으로 이동한다는 것은 데이터를 2의 n승으로 나눈 다음 반올림한다는 의미입니다.

//print_r(decbin($rgb));//$rgb = 15326445 이진수 111010011101110011101101로 변환됨
//에코 $rgb >> 16;//233 15326445/2^16 = 233.862991333
//echo decbin($rgb >> 16);//11101001 $rgb의 이진 값을 오른쪽으로 16만큼 이동하고 초과 부분을 제거하여
//$r = ($rgb>> 16) & 0xFF;
//$g = ($rgb>> 8) & 0xFF;
//$b = $rgb & 0xFF;



함수 평균($img) {
    $w = 이미지x($img);
    $h = 이미지($img);
    $r = $g = $b = 0;
    for($y = 0; $y < $h; $y++) {
        for($x = 0; $x < $w; $x++) {

//색상 표현 및 비트 연산 http://www.cnblogs.com/mengdd/p/3254292.html
            $rgb = imagecolorat($img, $x, $y);
            $r += $rgb >>
            $g += $rgb >>8 & 255;
            $b += $rgb & 255;
        }
    }
    $pxls = $w * $h;
    $r = decex(round($r / $pxls));
    $g = dechex(round($g / $pxls));
    $b = decex(round($b / $pxls));
    if(strlen($r) < 2) {
        $r = 0 .
    }
    if(strlen($g) < 2) {
        $g = 0 $g;
    }
    if(strlen($b) < 2) {
        $b = 0 $b;
    }
    "#"을 반환합니다. $r .
}


print_r(평균($im));

이 코드

$r += $rgb >>
$g += $rgb >>8 & 255;
$b += $rgb & 255;
          

이해할 수 없는 점은 시프트 후에 비트 및 255 연산이 필요한 이유입니다.

某草草某草草2754일 전577

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:09:44

    (mask & 0xff) 目的在于消除mask결과가 0-255 범위 내에 있도록 8자리 이상의 상위 데이터를 입력하세요

    회신하다
    0
  • 阿神

    阿神2017-05-16 13:09:44

    $rgb가 0x111111 你又不 & 255,结果会是 $g = 0x1111 $b=0x111111

    인 경우

    회신하다
    0
  • 취소회신하다