Avatar billede simseboii Nybegynder
12. august 2007 - 18:51 Der er 14 kommentarer

GDlib: Billede på billede

Hej.
Jeg ved, hvordan man ligger tekst på et billede med GDlib, men jeg har længe prøvet at finde ud af, hvordan man ligger et billede på et billede med GDlib. Er der nogen, der kan fortælle mig det?

På forhånd tak.
- Simon
Avatar billede jakobdo Ekspert
12. august 2007 - 22:02 #1
Du skal have fat i et script som kan laver WATERMARKS.

Se f.eks. denne kode fra en tidligere tråd:

<?php

//Setup
$uploaddir = '/upload/';
$maxSize = 8388608;
$allowPics = array('jpg','jpeg','jpe');
$numberOfPictures = 5;

$watermark_png = 'watermark.png';

if(is_array($_FILES['userFile']))
{
    $watermark = imagecreatefrompng($watermark_png);
 
    $watermark_width = imagesx($watermark);
    $watermark_height = imagesy($watermark);
   
    echo '<pre>';
    print_r($_FILES);
    echo '<pre>';
    for($i = 0; $i < $numberOfPictures; $i++)
    {
        if($_FILES['userFile']['size'][$i] == 0)
        {
            continue;
        }
       
        if($_FILES['userFile']['size'][$i] > $maxSize)
        {
            echo 'Dit billede nummer ' . ($i+1) . ' er for stort, prøv med mindre...';
            continue;
        }
        $uploadfile = getcwd() . $uploaddir . 'test_' . basename($_FILES['userFile']['name'][$i]);
       
        $ext = strtolower(end(explode(".",$_FILES['userFile']['name'][$i])));
        if(!in_array($ext,$allowPics))
        {
            echo 'Forkert billede format i billede ' . ($i+1) . ', prøv med et andet (jpg, jpeg eller jpe)!';
            continue;
        }
       
        $imgSrc = $_FILES['userFile']['tmp_name'][$i];
       
        $image  = imagecreatefromjpeg($imgSrc);
        $width  = imagesx($image);
        $height = imagesy($image);

        if($watermark_width > $width || $watermark_height > $height)
        {
            $dstim = imagecreatetruecolor(30, 10);
            imagecopyresampled( $dstim, $watermark, 0, 0, 0, 0, 30, 10, $watermark_width, $watermark_height );
            $dest_x = $width - 35;
            $dest_y = $height - 15;

            imagecopymerge($image, $dstim, $dest_x, $dest_y, 0, 0, 30, 10, 100);
        }
        else
        {
            $dest_x = $width - $watermark_width - 5;
            $dest_y = $height - $watermark_height - 5;
   
            imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100);
        }
       
        imagejpeg($image,$uploadfile,100);
        imagedestroy($image);
    }
    imagedestroy($watermark);
    header("Location: " . $_SERVER['PHP_SELF']);
    exit();
}
else
{
?>

<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="<?=$_SERVER['PHP_SELF'];?>" method="POST">
<table>
    <?php
    for($i = 0; $i < $numberOfPictures; $i++)
    {
        echo '<tr><td>Send file ' . ($i+1) . ':</td><td><input name="userFile[]" type="file" /></td></tr>'."\n";
    }
    ?>
    <tr><td colspan="2"><input type="submit" value="Send File" /></td></tr>
</table>
</form>

<?
}

?>
Avatar billede simseboii Nybegynder
13. august 2007 - 08:04 #2
Hej.
Mange tak - det er præcis, hvad jeg mangler!

Men der er opstået et problem: Før var teksten på billedet hvid, men så lagde jeg det lille billede til venstre ind på den sorte baggrund og nu begynder teksten at variere alt efter hvilket billede, der er i venstre side.

Her er nogle eksempler:

http://www.snuzzer.dk/charinfo/img.php?realm=Al'Akir&character=Snuzzer&show=123456
http://www.snuzzer.dk/charinfo/img.php?realm=Al'Akir&character=Braknar&show=123456
http://www.snuzzer.dk/charinfo/img.php?realm=Al'Akir&character=Biz&show=123456

- Simon
Avatar billede simseboii Nybegynder
13. august 2007 - 08:06 #3
Hov - jeg må nok hellere smide min kode.

$overlay = imagecreatefromgif("watermark.png");

$overlay_width = imagesx($overlay);
$overlay_height = imagesy($overlay);

$img = imagecreatefromgif("gfx/background.gif");
 
imagecopymerge($img, $overlay, 5, 5, 0, 0, $overlay_width, $overlay_height, 100);

$color = imageColorAllocate($img,255,255,255);
$color = imageColorExact($img,255,255,255);
$font = imageloadfont("font/dyno.gdf");

$dest_x = 74;
$dest_y = -6;

imageString($img, $font, $dest_x, $dest_y, $char[0], $color);
Avatar billede jakobdo Ekspert
13. august 2007 - 08:22 #4
Hvad er det du laver her:
$color = imageColorAllocate($img,255,255,255);
$color = imageColorExact($img,255,255,255); ?
Avatar billede simseboii Nybegynder
13. august 2007 - 12:22 #5
Jeg går ud fra, at jeg sætter farven på skriften i det stykke kode, men jeg fandt den kode for lang tid siden.
Avatar billede jakobdo Ekspert
13. august 2007 - 12:27 #6
Prøv at fjern: $color = imageColorExact($img,255,255,255);
Avatar billede simseboii Nybegynder
13. august 2007 - 14:43 #7
Det gør ingen forskel.
Avatar billede jakobdo Ekspert
13. august 2007 - 17:26 #8
Kan du vise den fulde kode?
Avatar billede simseboii Nybegynder
13. august 2007 - 18:08 #9
Ja, selvfølgelig:

<?php
header("Content-Type: image/gif");

$adresse = htmlentities(file_get_contents("http://armory.wow-europe.com/character-sheet.xml?r=".str_replace(" ", "+", str_replace("\\", "", $_GET[realm]))."&n=".$_GET[character]),ENT_QUOTES);
$udskift = array("\t", "  ", "\r\n", "\r");
$udskiftMed = array("&nbsp;", "&nbsp;", "\n", "\n");
$kildekode = str_replace($udskift, $udskiftMed, $adresse);

$classid = explode("theClassId = ", $kildekode);
$classid = explode(";", $classid[1]);

$raceid = explode("theRaceId = ", $kildekode);
$raceid = explode(";", $raceid[1]);

$char = explode("theCharName = &quot;", $kildekode);
$char = explode("&quot;", $char[1]);

$sex = explode("images/portraits/wow-70/", $kildekode);
$sex = explode("-", $sex[1]);

$guild = explode("&lt;h3&gt;", $kildekode);
$guild = explode("&lt;/h3&gt;", $guild[2]);

$level = explode("theLevel = ", $kildekode);
$level = explode(";", $level[1]);

$class = explode("theClassName = &quot;", $kildekode);
$class = explode("&quot;", $class[1]);

$realm = explode("theRealmName = &quot;", $kildekode);
$realm = explode("&quot;", $realm[1]);

$prof1 = explode("&lt;a href=&quot;java script: ajaxLink(%22character-skills.xml?%22+ theCharUrl);&quot;&gt;", $kildekode);
$prof1 = explode("&lt;/a&gt;", $prof1[1]);

$prof1skill = explode("&lt;span&gt;", $kildekode);
$prof1skill = explode("&lt;/span&gt;", $prof1skill[9]);

$prof2 = explode("&lt;a href=&quot;java script: ajaxLink(%22character-skills.xml?%22+ theCharUrl);&quot;&gt;", $kildekode);
$prof2 = explode("&lt;/a&gt;", $prof2[2]);

$prof2skill = explode("&lt;span&gt;", $kildekode);
$prof2skill = explode("&lt;/span&gt;", $prof2skill[10]);

$talents = explode("&lt;span&gt;", $kildekode);
$talents = explode("&lt;/span&gt;", $talents[8]);

if($level[0] < 70)
{
    $piclevel = "default";
}
else
{
    $piclevel = 70;
}

$overlay = imagecreatefromgif("http://armory.wow-europe.com/images/portraits/wow-".$piclevel."/".$sex[0]."-".$raceid[0]."-".$classid[0].".gif");

$overlay_width = imagesx($overlay);
$overlay_height = imagesy($overlay);

$img = imagecreatefromgif("gfx/background.gif");
 
imagecopymerge($img, $overlay, 5, 5, 0, 0, $overlay_width, $overlay_height, 100);

$color = imageColorAllocate($img,255,255,255);
$font = imageloadfont("font/dyno.gdf");

$dest_x = 74;
$dest_y = -6;

imageString($img, $font, $dest_x, $dest_y, $char[0], $color);

$font = imageloadfont("font/proggysquare.gdf");

$dest_x = 78;
$dest_y = 26;

imageString($img, $font, $dest_x, $dest_y, "<$guild[0]>  $level[0] $class[0], ".str_replace("+", " ", str_replace("\\", "", $_GET[realm])), $color);

$dest_x = 77;
$dest_y = 42;

if($prof1[0] != "" && $prof2[0] != "")
{
    imageString($img, $font, $dest_x, $dest_y, "$prof1[0]: $prof1skill[0] $prof2[0]: $prof2skill[0]", $color);
}
elseif($prof1[0] != "" && $prof2[0] == "")
{
    imageString($img, $font, $dest_x, $dest_y, "$prof1[0]: $prof1skill[0]", $color);
}
elseif($prof1[0] == "" && $prof2[0] != "")
{
    imageString($img, $font, $dest_x, $dest_y, "$prof2[0]: $prof2skill[0]", $color);
}

$dest_x = 11;
$dest_y = 75;

$font = 1;

imageString($img, $font, $dest_x, $dest_y, $talents[0], $color);

function show($valg, $realm, $character)
{
    $adresse = htmlentities(file_get_contents("http://armory.wow-europe.com/character-sheet.xml?r=".str_replace(" ", "+", str_replace("\\", "", $_GET[realm]))."&n=".$_GET[character]),ENT_QUOTES);
    $udskift = array("\t", "  ", "\r\n", "\r");
    $udskiftMed = array("&nbsp;", "&nbsp;", "\n", "\n");
    $kildekode = str_replace($udskift, $udskiftMed, $adresse);

    $health = explode("&lt;span&gt;", $kildekode);
    $health = explode("&lt;/span&gt;", $health[11]);

    $mana = explode("&lt;span&gt;", $kildekode);
    $mana = explode("&lt;/span&gt;", $mana[12]);

    $armor = explode("this.base = &quot;", $kildekode);
    $armor = explode("&quot;", $armor[6]);

    $stamina = explode("this.effective = &quot;", $kildekode);
    $stamina = explode("&quot;", $stamina[3]);

    $intellect = explode("this.effective = &quot;", $kildekode);
    $intellect = explode("&quot;", $intellect[4]);

    $spirit = explode("this.effective = &quot;", $kildekode);
    $spirit = explode("&quot;", $spirit[5]);

    $strength = explode("this.effective = &quot;", $kildekode);
    $strength = explode("&quot;", $strength[1]);

    $agility = explode("this.effective = &quot;", $kildekode);
    $agility = explode("&quot;", $agility[2]);

    $holy = explode("this.holy = ", $kildekode);
    $holy = explode(";", $holy[1]);

    $arcane = explode("this.arcane = ", $kildekode);
    $arcane = explode(";", $arcane[2]);

    $fire = explode("this.fire = ", $kildekode);
    $fire = explode(";", $fire[2]);

    $nature = explode("this.nature = ", $kildekode);
    $nature = explode(";", $nature[2]);

    $frost = explode("this.frost = ", $kildekode);
    $frost = explode(";", $frost[2]);

    $shadow = explode("this.shadow = ", $kildekode);
    $shadow = explode(";", $shadow[2]);

    $choly = explode("this.holy = ", $kildekode);
    $choly = explode(";", $choly[3]);
    $carcane = explode("this.arcane = ", $kildekode);
    $carcane = explode(";", $carcane[3]);
    $cfire = explode("this.fire = ", $kildekode);
    $cfire = explode(";", $cfire[3]);
    $cnature = explode("this.nature = ", $kildekode);
    $cnature = explode(";", $cnature[3]);
    $cfrost = explode("this.frost = ", $kildekode);
    $cfrost = explode(";", $cfrost[3]);
    $cshadow = explode("this.shadow = ", $kildekode);
    $cshadow = explode(";", $cshadow[3]);
    $critchance = ($choly[0] + $carcane[0] + $cfire[0] + $cnature[0] + $cfrost[0] + $cshadow[0]) / 6;

    switch($valg)
    {
        case "0":
            break;
        case "1":
            return "Health: ".$health[0];
            break;
        case "2":
            return "Mana: ".$mana[0];
            break;
        case "3":
            return "Armor: ".$armor[0];
            break;
        case "4":
            return "Stamina: ".$stamina[0];
            break;
        case "5":
            return "Intellect: ".$intellect[0];
            break;
        case "6":
            return "Spirit: ".$spirit[0];
            break;
        case "7":
            return "Strength: ".$strength[0];
            break;
        case "8":
            return "Agility: ".$agility[0];
            break;
        case "9":
            return "Holy: ".$holy[0];
            break;
        case "10":
            return "Arcane: ".$arcane[0];
            break;
        case "11":
            return "Fire: ".$fire[0];
            break;
        case "12":
            return "Nature: ".$nature[0];
            break;
        case "13":
            return "Frost: ".$frost[0];
            break;
        case "14":
            return "Shadow: ".$shadow[0];
            break;
        case "15":
            return "Crit: ".$critchance[0]."%";
            break;
    }
}

$font = imageloadfont("font/proggysquare.gdf");

$dest_x = 77;
$dest_y = 58;

imageString($img, $font, $dest_x, $dest_y, show(substr($_GET[show], 0, 2)), $color);

$dest_x = 77;
$dest_y = 73;

imageString($img, $font, $dest_x, $dest_y, show(substr($_GET[show], 2, 2)), $color);

$dest_x = 180;
$dest_y = 58;

imageString($img, $font, $dest_x, $dest_y, show(substr($_GET[show], 4, 2)), $color);

$dest_x = 180;
$dest_y = 73;

imageString($img, $font, $dest_x, $dest_y, show(substr($_GET[show], 6, 2)), $color);

$dest_x = 293;
$dest_y = 58;

imageString($img, $font, $dest_x, $dest_y, show(substr($_GET[show], 8, 2)), $color);

$dest_x = 293;
$dest_y = 73;

imageString($img, $font, $dest_x, $dest_y, show(substr($_GET[show], 10, 2)), $color);

imageGIF($img);
?>
Avatar billede jakobdo Ekspert
13. august 2007 - 20:15 #10
Jeg tror jeg har fundet fejlen.
Det er ikke lige meget hvilken type dine GIF billeder er i.
F.eks. prøvede jeg at bruge en ikke RGB gif og da var teksten SORT (den skulle være HVID).
Så gemte jeg gif billedet korrekt i RGB og så var teksten hvid som den skulle.
Avatar billede simseboii Nybegynder
13. august 2007 - 20:25 #11
Hej.
Det vil sige, at de små billeder ikke er RGB?

Okay, mange tak.
Smid et svar ;-)
Avatar billede jakobdo Ekspert
13. august 2007 - 20:32 #12
Jeg smider kun et svar hvis det var løsningen.
Avatar billede simseboii Nybegynder
13. august 2007 - 21:39 #13
Hej.
Undskyld, jeg er bange for, at det ikke er løsningen.
Jeg lavede et nyt RGB dokument i Photoshop, kopierede følgende billede ind i det og gemte og smed det ind i koden, men det ændrede ingenting. Jeg gjorde det samme ved baggrunden og lige lidt hjalp det.

http://armory.wow-europe.com/images/portraits/wow-70/0-7-9.gif

Du kan se billederne, jeg har prøvet at lave RGB her:
http://www.snuzzer.dk/charinfo/gfx
Avatar billede jakobdo Ekspert
13. august 2007 - 22:01 #14
Nu lavede jeg lidt mere test.
Kan du vælge mellem 32, 64 og 128 farver?
Hvis jeg valgte 128, så blev teksten sort.
Hvis jeg valgte 32 eller 64 (begge billeder) så var teksten korrekt hvid.
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