php - Nilai warna imej >> 8 & 255 Mengapa bit harus sama dengan 255 selepas beralih?
某草草
某草草 2017-05-16 13:07:44
0
2
573
<?php
/**
imagecolorat — Dapatkan nilai indeks warna piksel

int imagecolorat ( sumber $image , int $x , int $y )

Mengembalikan nilai indeks warna piksel pada kedudukan yang ditentukan dalam grafik yang ditentukan oleh imej.

Jika PHP telah disusun dengan pustaka GD 2.0 atau lebih tinggi dan imej ialah imej truecolor, fungsi ini mengembalikan nilai RGB titik sebagai integer. Gunakan shifting dan masking untuk mendapatkan nilai komponen merah, hijau dan biru:
*/
//echo dechex(255);mati;//ff heksadesimal ff = perpuluhan 255
ini_set('display_errors', 'On');

error_reporting(E_ALL | E_STRICT);//E_ALL: semua maklumat ralat dan amaran kecuali E_STRICT
//E_STRICT: Mendayakan cadangan PHP untuk pengubahsuaian kod untuk memastikan kesalingoperasian terbaik dan keserasian hadapan kod.

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


//Penjelasan mengenai operasi syif https://my.oschina.net/u/435872/blog/134802,



//Menukar n bit ke kiri bermakna mendarabkan data dengan 2 kepada kuasa ke-n. Mengalihkan n bit ke kanan bermakna membahagikan data dengan 2 kepada kuasa ke-n dan kemudian membulatkannya.

//print_r(decbin($rgb));//$rgb = 15326445 ditukar kepada binari 111010011101110011101101
//echo $rgb >> 16;//233 15326445/2^16 = 233.862991333
//echo decbin($rgb >> 16);//11101001 Alihkan nilai binari $rgb ke kanan sebanyak 16, dan keluarkan bahagian yang berlebihan untuk mendapatkan
//$r = ($rgb >> 16) & 0xFF;
//$g = ($rgb >> 8) & 0xFF;
//$b = $rgb & 0xFF;



purata fungsi($img) {
    $w = imejx($img);
    $h = imagesy($img);
    $r = $g = $b = 0;
    untuk($y = 0; $y < $h; $y++) {
        untuk($x = 0; $x < $w; $x++) {

//Perwakilan warna dan operasi bit http://www.cnblogs.com/mengdd/p/3254292.html
            $rgb = imagecolorat($img, $x, $y);
            $r += $rgb >>
            $g += $rgb >>
            $b += $rgb & 255;
        }
    }
    $pxls = $w * $h;
    $r = dechex(bulat($r / $pxls));
    $g = dechex(bulat($g / $pxls));
    $b = dechex(bulat($b / $pxls));
    if(strlen($r) < 2) {
        $r = 0 $r;
    }
    if(strlen($g) < 2) {
        $g = 0 .
    }
    if(strlen($b) < 2) {
        $b = 0 .
    }
    kembalikan "#" $r .
}


print_r(purata($im));

Kod ini

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

Apa yang saya tidak faham ialah mengapa operasi bit dan 255 diperlukan selepas peralihan

某草草
某草草

membalas semua(2)
伊谢尔伦

(mask & 0xff) 目的在于消除maskMasukkan data pesanan tinggi lebih daripada 8 digit untuk memastikan keputusan berada dalam julat 0-255

阿神

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan