2009-11-17 27 views
9

Chcę wyświetlać obrazy wewnątrz elementów div lub tabel jako tła. Jeśli obrazy nie są wystarczająco duże, będę musiał znaleźć najbardziej zewnętrzny kolor tego obrazu i zastosować go do tła zawierającego div lub komórki tabeli.Pobierz kolor obrazu

Czy ktoś ma z tym doświadczenie? W PHP. Jestem noobem, więc proszę wyjaśnij. Dziękuję bardzo

+0

Czy to działa? –

Odpowiedz

23

Sprawdź GD functions.

Oto rozwiązanie polegające na znalezieniu najczęstszego koloru w rozmiarze looping through the pixels. Jednak you could just resize the image to 1 pixel - to powinien być średni kolor - prawda?

Przykładem metody 1px (teraz tym testowej stronie):

<?php 
    $filename = $_GET['filename'];  
    $image = imagecreatefromjpeg($filename); 
    $width = imagesx($image); 
    $height = imagesy($image); 
    $pixel = imagecreatetruecolor(1, 1); 
    imagecopyresampled($pixel, $image, 0, 0, 0, 0, 1, 1, $width, $height); 
    $rgb = imagecolorat($pixel, 0, 0); 
    $color = imagecolorsforindex($pixel, $rgb); 
?> 
<html> 
    <head> 
    <title>Test Image Average Color</title> 
    </head> 
    <body style='background-color: rgb(<?php echo $color['red'] ?>, <?php echo $color['green'] ?>, <?php echo $color['blue'] ?>)'> 
    <form action='' method='get'> 
     <input type='text' name='filename'><input type='submit'> 
    </form> 
    <img src='<?php echo $filename ?>'> 
    </body> 
</html> 

Oto niektóre przykładowy kod dla znalezienia przeciętną granicy kolor, podobny do pierwszego ogniwa. Do użytku może działać lepiej (wiem, kod ten jest nieskuteczny, ale mam nadzieję, że to jest łatwe do naśladowania):

<?php 
    $filename = $_GET['filename'];  
    $image = imagecreatefromjpeg($filename); 
    $width = imagesx($image); 
    $height = imagesy($image); 

    for($y = 0; $y < $height; $y++){ 
    $rgb = imagecolorat($image, 0, $y); 
    $color = imagecolorsforindex($image, $rgb); 
    $red += $color['red']; 
    $green += $color['green']; 
    $blue += $color['blue']; 

    $rgb = imagecolorat($image, $width -1, $y); 
    $color = imagecolorsforindex($image, $rgb); 
    $red += $color['red']; 
    $green += $color['green']; 
    $blue += $color['blue']; 
    } 

    for($x = 0; $x < $height; $x++){ 
    $rgb = imagecolorat($image, $x, 0); 
    $color = imagecolorsforindex($image, $rgb); 
    $red += $color['red']; 
    $green += $color['green']; 
    $blue += $color['blue']; 

    $rgb = imagecolorat($image, $x, $height -1); 
    $color = imagecolorsforindex($image, $rgb); 
    $red += $color['red']; 
    $green += $color['green']; 
    $blue += $color['blue']; 
    } 

    $borderSize = ($height=$width)*2; 
    $color['red'] = intval($red/$borderSize); 
    $color['green'] = intval($green/$borderSize); 
    $color['blue'] = intval($blue/$borderSize); 

?> 

Aktualizacja: kładę trochę more refined code on github. Obejmuje to uśrednianie granicy i uśrednianie całego obrazu. Należy zauważyć, że zmiana rozmiaru na 1px jest znacznie bardziej przyjazna dla zasobów niż skanowanie każdego piksela (chociaż nie przeprowadziłem żadnych testów w czasie rzeczywistym), ale kod pokazuje trzy różne metody.

+0

Wykonano kilka testów kodu zmiany rozmiaru i wydaje się, że działa. –

+0

Przepraszam, ale jestem początkujący, jak zastosować to do div dla koloru tła? Każdy pomysł Tim. Dzięki za sugestię, to też dużo znaczy. –

+0

Oh daj mi zobaczyć, czy mogę to zadziałać, DZIĘKUJĘ TIM –

Powiązane problemy