Avatar billede donslund Nybegynder
03. maj 2005 - 22:00 Der er 19 kommentarer og
1 løsning

RGB værdi på pixelniveau

Ken jeg evt. med GDlib tjekke hver enkelt pixel i et billede for det RGB værdi?
Avatar billede coderdk Praktikant
03. maj 2005 - 22:03 #1
Det kan du med imagecolorat: http://dk2.php.net/imagecolorat

:)
Avatar billede donslund Nybegynder
03. maj 2005 - 22:43 #2
Jeg synes ikke helt, at den fanger det antal pixels der er i billedet. Ved godt, at det er mange den skal beregne.

Min kode:

<?php

// print "filnavn = ".$filnavn;
$allowedTypes = array("image/jpeg", "image/pjpeg", "image/jpg");

$maxFileSize = 10307200;
$max_width = 2400;
$max_height = 2400;
$antal = 0;

$path = "galleri/";

if($_FILES['img']['size']> 0){
    if (in_array($_FILES['img']['type'],$allowedTypes)){
        if ($_FILES['img']['size'] <= $maxFileSize){
            $size = getimagesize($_FILES['img']['tmp_name']);
            if($size[0] < $max_width){
                if($size[1] < $max_height){
                    $im=ImageCreateFromJpeg($_FILES['img']['tmp_name']);
                    for ($i = 0; $i < $size[0]; $i++) {
                        for ($j = 0; $j < $size[1]; $j++) {
                            $rgb = ImageColorAt($im, $i, $j);
                            $r = ($rgb >> 16) & 0xFF;
                            $g = ($rgb >> 8) & 0xFF;
                            $b = $rgb & 0xFF;
                            if ($r>$b&&$r>$g) {
                                $red = $red + 1;
                            } else if ($b>$r&&$b>$g) {
                                $blue = $blue + 1;
                            } else if ($g>$b&&$g>$r) {
                                $green = $green + 1;
                            } else {
                                $equal = $equal + 1;
                            }
                            $antal = $antal + 1;
                        }
                    }
            }else{
                    $fejl = "Billede ikke sat ind: Filen er for høj!";
                }
            }else{
                $fejl = "Billede ikke sat ind: Filen er for bred!";
            }
        }else{
            $fejl = "Billede ikke sat ind: Filen er for stor!";
        }
    }else{
        $fejl = "Billede ikke sat ind: Forkert fil-format!";
    }
}

if(isset($fejl)){
    echo $fejl;
}else{
    print "Pixels beregnet: ".$size[0]*$size[1]."<BR>";
    print "R = ".$red." - G = ".$green." - B = ".$blue." - Ens = ".$equal." - ialt:".$red+$green+$blue+$equal;
   
}
?>
Avatar billede coderdk Praktikant
03. maj 2005 - 22:50 #3
Erh, ok, hvordan ser dit output ud da?
Avatar billede donslund Nybegynder
03. maj 2005 - 22:55 #4
Pixels beregnet: 534400
289576


Billedet måler 1024x768

Hvordan får jeg billedet vi nedenunder resultatet?
Avatar billede coderdk Praktikant
03. maj 2005 - 22:57 #5
Ja, det lyder da underligt :P

Ved at flytte billedet ind i web-scope med move_uploaded_file og lave en <img src='et_navn'> :)
Avatar billede donslund Nybegynder
03. maj 2005 - 23:01 #6
Du kan se her hvordan jeg gør: http://www.kongeborgen.dk/farver/

Jeg "uploader" billedet, emn det bliver vist ikke gemt noget sted.
Kan jeg gøre det, så det kan genbruges?
Avatar billede coderdk Praktikant
03. maj 2005 - 23:09 #7
Ja, din gav mig også underlige tal, så omformatterede jeg og satte et par parenteser:

<?php

    // print "filnavn = ".$filnavn;
    $allowedTypes = array("image/jpeg", "image/pjpeg", "image/jpg");
   
    $maxFileSize = 10307200;
    $max_width = 2400;
    $max_height = 2400;
    $antal = 0;
    $red = 0;
    $green = 0;
    $blue = 0;
    $equal = 0;
   
    $path = "galleri/";
   
    if ( $_FILES['img']['size'] > 0 )
    {
        if ( in_array( $_FILES['img']['type'], $allowedTypes ) )
        {
            if ( $_FILES['img']['size'] <= $maxFileSize )
            {
                $size = getimagesize($_FILES['img']['tmp_name']);
                if ( $size[0] < $max_width )
                {
                    if( $size[1] < $max_height )
                    {
                        $im=ImageCreateFromJpeg( $_FILES['img']['tmp_name'] );
                        for ($i = 0; $i < $size[0]; $i++)
                        {
                            for ($j = 0; $j < $size[1]; $j++)
                            {
                                $rgb = ImageColorAt( $im, $i, $j );
                                $r = ($rgb >> 16) & 0xFF;
                                $g = ($rgb >> 8) & 0xFF;
                                $b = $rgb & 0xFF;
                                if ( $r > $b && $r > $g )
                                {
                                    $red++;
                                }
                                else if ( $b > $r && $b > $g )
                                {
                                    $blue++;
                                }
                                else if ( $g > $b && $g > $r )
                                {
                                    $green++;
                                }
                                else
                                {
                                    $equal++;
                                }
                                $antal++;
                            }
                        }
                    }
                    else
                    {
                        $fejl = "Billede ikke sat ind: Filen er for høj!";
                    }
                }
                else
                {
                    $fejl = "Billede ikke sat ind: Filen er for bred!";
                }
            }
            else
            {
                $fejl = "Billede ikke sat ind: Filen er for stor!";
            }
        }
        else
        {
            $fejl = "Billede ikke sat ind: Forkert fil-format!";
        }
    }
   
    if ( isset( $fejl ) )
    {
        echo $fejl;
    }
    else
    {
        print "Pixels beregnet: ". ( $size[0] * $size[1] ) ."<BR>";
        print "R = ".$red." - G = ".$green." - B = ".$blue." - Ens = ".$equal." - ialt:".( $red + $green + $blue + $equal ) . "<br>";
        print "I alt: " . $antal;
     
    }
   
?>

Den ligner lidt det jeg har lavet, prøv lige det...

Den gav mig:

Pixels beregnet: 480000
R = 284725 - G = 52998 - B = 107543 - Ens = 34734 - ialt:480000
I alt: 480000
Avatar billede donslund Nybegynder
03. maj 2005 - 23:12 #8
Ja, det var meget bedre. Tak for det. Men jeg kan ikke helt få det med at få billedet vist til at virke.
Avatar billede coderdk Praktikant
03. maj 2005 - 23:14 #9
Hvordan gør du?
Hvis du bruger billede.php til at vise det skal du lave den sådan i det første script:

print '<img src="billede.php?navn=' . $_FILES['img']['tmp_name'] . '">';

og billede.php noget i stil med:

<?php

  header( 'Content-Type: image/jpeg' );
  readfile( $_GET['file'] );

?>
Avatar billede donslund Nybegynder
03. maj 2005 - 23:28 #10
Hvis det er nemmere uden billede.php hvordan gøres det så? Der er ingen brug for billedet senere, så det behøves rent faktisk ikke at blive gemt på serveren.
Avatar billede coderdk Praktikant
03. maj 2005 - 23:52 #11
Well det nemmeste er så ikke at skrive noget ud, og så bare bruge:

header('Content-Type: image/jpeg');
imagejpeg($im, '', 100);

I bunden af scriptet ;)
Avatar billede donslund Nybegynder
04. maj 2005 - 11:19 #12
Og når det så udmønter sig i en masse mærkelige tegn i stedet for et billede. Hvad er der så galt?
Avatar billede coderdk Praktikant
04. maj 2005 - 14:23 #13
Så har du ikke sat header-linjen ind da? De mærkelige tegn er jo billedet...
Som sagt du har to valgmuligheder, flyt filen over og henvis til den fra siden med alm. html img, eller du kan lad være med at skrive noget som helst andet ud på siden, andet end den header- og imagejpeglinje :)
Avatar billede donslund Nybegynder
04. maj 2005 - 14:42 #14
Da jeg satte header ind nede sammen med imagejpeg, kom den og sagde, at header allerede var sendt. Jeg laver jo noget tabel-værk over, så jeg flyttede header op aller øverst på siden. Duer det ikke?


Du får lige hele filen:

<?
header('Content-Type: image/jpeg');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>farveberegning</title>
</head>
<body>
<?php

    // print "filnavn = ".$filnavn;
    $allowedTypes = array("image/jpeg", "image/pjpeg", "image/jpg");
   
    $maxFileSize = 10307200;
    $max_width = 2400;
    $max_height = 2400;
    $antal = 0;
    $red = 0;
    $green = 0;
    $blue = 0;
        $purple = 0;
        $yellow = 0;
        $cyan = 0;
        $black = 0;
        $white = 0;
    $equal = 0;
   
    $path = "galleri/";
   
    if ( $_FILES['img']['size'] > 0 )
    {
        if ( in_array( $_FILES['img']['type'], $allowedTypes ) )
        {
            if ( $_FILES['img']['size'] <= $maxFileSize )
            {
                $size = getimagesize($_FILES['img']['tmp_name']);
                if ( $size[0] < $max_width )
                {
                    if( $size[1] < $max_height )
                    {
                        $im=ImageCreateFromJpeg( $_FILES['img']['tmp_name'] );
                        for ($i = 0; $i < $size[0]; $i++)
                        {
                            for ($j = 0; $j < $size[1]; $j++)
                            {
                                $rgb = ImageColorAt( $im, $i, $j );
                                $r = ($rgb >> 16) & 0xFF;
                                $g = ($rgb >> 8) & 0xFF;
                                $b = $rgb & 0xFF;
                                if ( $r > $b && $r > $g )
                                {
                                    $red++;
                                }
                                else if ( $b > $r && $b > $g )
                                {
                                    $blue++;
                                }
                                else if ( $g > $b && $g > $r )
                                {
                                    $green++;
                                                                }
                                else if ( $r == $g && $g > $b )
                                {
                                    $yellow++;
                                }
                                                                else if ( $r == $b && $b > $g )
                                {
                                    $purple++;
                                }
                                                                else if ( $g == $b && $b > $r )
                                {
                                    $cyan++;
                                }
                                else if ( $g == $b && $b == $r && $r = 0 )
                                {
                                    $black++;
                                }
                                else if ( $g == $b && $b == $r && $r = 255 )
                                {
                                    $white++;
                                }
                                else
                                {
                                    $equal++;
                                }
                                $antal++;
                            }
                        }
                    }
                    else
                    {
                        $fejl = "Billede ikke sat ind: Filen er for høj!";
                    }
                }
                else
                {
                    $fejl = "Billede ikke sat ind: Filen er for bred!";
                }
            }
            else
            {
                $fejl = "Billede ikke sat ind: Filen er for stor!";
            }
        }
        else
        {
            $fejl = "Billede ikke sat ind: Forkert fil-format!";
        }
    }
   
    if ( isset( $fejl ) )
    {
        echo $fejl;
    }
    else
    {
?>
<TABLE BORDER="0">
<TR VALIGN="top">
    <TD width="20px"></TD>
    <TD width="50px">Pixels</TD>
    <TD width="100px">Areal i %</TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#ff0000; border:1px solid #000000">&nbsp;</TD>
    <TD width="50px"><? print $red ?></TD>
    <TD width="100px"><? print round(100/$antal*$red, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#00ff00; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $green ?></TD>
    <TD><? print round(100/$antal*$green, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <td width="20px" style="background-color:#0000ff;border:solid 1px #000000;">&nbsp;</TD>
    <TD><? print $blue ?></TD>
    <TD><? print round(100/$antal*$blue, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#ffff00; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $yellow ?></TD>
    <TD><? print round(100/$antal*$yellow, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#ff00ff; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $purple ?></TD>
    <TD><? print round(100/$antal*$purple, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#00ffff; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $cyan ?></TD>
    <TD><? print round(100/$antal*$cyan, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#ffffff; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $white ?></TD>
    <TD><? print round(100/$antal*$white, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#000000; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $black ?></TD>
    <TD><? print round(100/$antal*$black, 2)." %" ?></TD>
</TR>
<TR VALIGN="top">
    <TD width="20px" style="background-color:#808080; border:1px solid #000000">&nbsp;</TD>
    <TD><? print $equal ?></TD>
    <TD><? print round(100/$antal*$equal, 2)." %" ?></TD>
</TR>
</TABLE>

<?
print "Pixels beregnet: ". ( $size[0] * $size[1] ) ."<BR><br><br>";
       
print "<img src=\"diagram.php?data=".$red."\*".$green."\*".$blue."\*".$yellow."\*".$purple."\*".$cyan."\*".$black."\*".$white."\*".$equal."&etiket=Rød*Grøn*Blå*Gul*Lilla*Cyan*Hvid*Sort*Grå\">";
//      print "<BR><BR><img src=\"".$_FILES['img']['tmp_name']."\">";

imagejpeg($im, '', 100);
    }
   
?>


</body>
</html>
Avatar billede coderdk Praktikant
04. maj 2005 - 14:44 #15
Nej så duer det ikke, som jeg skrev må du ikke skrive noget som helst andet ud før det - Så er du nødt til at flytte filen over og bruge <img>
Avatar billede donslund Nybegynder
04. maj 2005 - 14:51 #16
Og det er noget med imgaecopy!

imagecopy($im, 'tmpfile.jpg', 0, ???????????????
Avatar billede coderdk Praktikant
04. maj 2005 - 14:59 #17
Nej, imagejpeg( $im, 'nytfilnavn.jpg', 85 ) f.eks. :)
Avatar billede donslund Nybegynder
04. maj 2005 - 15:15 #18
Og hvordan bliver den gemt på serveren så?
Avatar billede coderdk Praktikant
04. maj 2005 - 15:21 #19
Som en fil i samme niveau som scriptet...
Avatar billede donslund Nybegynder
09. maj 2005 - 10:42 #20
Det hele er på plads nu. Tak for hjælpen.

Nu mangler jeg bare lige at forfine den lidt. RGB(1,0,0) ser jo mest hvid ud, men tolkes som rød. Men det skal der vist bare pusles lidt med.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester