cari

Rumah  >  Soal Jawab  >  teks badan

php - Nilai warna imej >> 8 & 255 Mengapa bit harus sama dengan 255 selepas beralih?

<?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

某草草某草草2756 hari yang lalu578

membalas semua(2)saya akan balas

  • 伊谢尔伦

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

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

    balas
    0
  • 阿神

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

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

    balas
    0
  • Batalbalas