2012-02-08 43 views
6

Tôi đang đối mặt với tình huống này khi tôi có ID đến từ cơ sở dữ liệu (vì vậy nó có thể là 1, 100, 1000, ...) và tôi cần tạo ra các màu ngẫu nhiên, cùng màu.PHP tạo RGB

Bất kỳ đề xuất nào về cách tôi có thể đạt được điều này?

Cảm ơn!

+0

Bạn có bất kỳ mã (hoặc mã giả) nào được viết cho đến thời điểm này không? – summea

+0

Điều gì về chia tách bit? Bit0-> Bit7 của R, Bit1-> Bit7 của G, Bit2-> Bit7 của B, Bit3-> Bit6 của R, ... trong khi điều này phức tạp, nó cho màu sắc rất khác nhau, miễn là không gian ID không quá lớn. –

Trả lời

25

Sử dụng một băm mật mã và clip các byte bạn không cần:

function getColor($num) { 
    $hash = md5('color' . $num); // modify 'color' to get a different palette 
    return array(
     hexdec(substr($hash, 0, 2)), // r 
     hexdec(substr($hash, 2, 2)), // g 
     hexdec(substr($hash, 4, 2))); //b 
} 

Các kết quả (code to generate it) trông như thế này cho các con số 0-20:

demo output

1
Cách tiếp cận rõ ràng là chỉ chuyển đổi ID thành màu (ví dụ 8 bit thấp hơn là màu xanh, 8 bit tiếp theo là Xanh lục, 8 tiếp theo là Đỏ - để lại 8 bit, nhưng tôi chắc chắn bạn có thể tìm ra ;-)

Giả sử này không làm việc (cos bạn kết thúc với một bảng màu khủng khiếp:. Sử dụng một mảng (hoặc bảng băm) để thực hiện một bản đồ của ID vào màu

Nếu bạn đang quan tâm rằng có quá nhiều ID, khi đó bạn có thể áp dụng một số băm cho ID và sử dụng nó khi bạn nhập vào ánh xạ "id to color". Trong trường hợp này, bạn có thể nói một id luôn có một màu, nhưng một màu có thể được nhiều ID khác sử dụng.

1
<?php 
// someting like this? 
$randomString = md5($your_id_here); // like "d73a6ef90dc6a ..." 
$r = substr($randomString,0,2); //1. and 2. 
$g = substr($randomString,2,2); //3. and 4. 
$b = substr($randomString,4,2); //5. and 6. 
?> 
<style> 
#topbar { border-bottom:4px solid #<?php echo $r.$g.$b; ?>; } 
</style> 
0

Nếu mảng luôn được sắp xếp, bạn có thể sử dụng algorythm này tối đa 250 mục:

<?php 
function getRGBColorString($array) 
{ 
    $indexColor = round(250/count($array)); 
    $iterator = 1; 

    $arrayOfRGB = array(); 

    foreach($array as $item) 
    { 
     $arrayOfRGB[] = "rgb(" . ($indexColor * $iterator) . ", 113, 113)"; 
     $iterator++; 
    } 

    return $arrayOfRGB; 
} 

?>