Avatar billede artico Novice
01. juli 2007 - 14:38 Der er 11 kommentarer og
1 løsning

Dot på image

Hej, jeg er ved at lave et system til at lave manualer og savner lidt hjælp.

Ideen er at man uploader nogle skærmbilleder (alle i samme px størelse), herefter skal man så sætte nogle reference punkter 1,2,3,4 (afsætte f.eks. dot.gif) osv... oven på skærmbilledet som så henviser til en  forklarende tekst.
Når man så er tilfreds med skærmbilledet og de afsatte punkter så skal det hele i en DB.

Det fedeste ville være hvis man kunne prikke et vilkårligt sted på det uploadede billede og dermed sætte et punkt f.eks 1. og kordinaten kunne gemmed i DB.

Der skal kunne sætte 10 punkter.
Jeg mangler hjælp til javascript delen.... Please
Avatar billede anri Novice
02. juli 2007 - 20:38 #1
Hvad er det sådan mere specifikt du mangler hjælp til?  Hvad har du at gøre godt mked i forvejen?
Avatar billede artico Novice
02. juli 2007 - 21:22 #2
Jeg har dette:
<style type="text/css">

.drag{
position:relative;
cursor:hand;
z-index: 100;
}

</style>

<script type="text/javascript">


var dragobject={
z: 0, x: 0, y: 0, offsetx : null, offsety : null, targetobj : null, dragapproved : 0,
initialize:function(){
document.onmousedown=this.drag
document.onmouseup=function(){this.dragapproved=0}
},
drag:function(e){
var evtobj=window.event? window.event : e
this.targetobj=window.event? event.srcElement : e.target
if (this.targetobj.className=="drag"){
this.dragapproved=1
if (isNaN(parseInt(this.targetobj.style.left))){this.targetobj.style.left=0}
if (isNaN(parseInt(this.targetobj.style.top))){this.targetobj.style.top=0}
this.offsetx=parseInt(this.targetobj.style.left)
this.offsety=parseInt(this.targetobj.style.top)
this.x=evtobj.clientX
this.y=evtobj.clientY
if (evtobj.preventDefault)
evtobj.preventDefault()
document.onmousemove=dragobject.moveit
}
},
moveit:function(e){
var evtobj=window.event? window.event : e
if (this.dragapproved==1){
this.targetobj.style.left=this.offsetx+evtobj.clientX-this.x+"px"
this.targetobj.style.top=this.offsety+evtobj.clientY-this.y+"px"
return false
}
}
}

dragobject.initialize()

</script>
    </head>

    <body bgcolor="#ffffff">
    <img src="maps/dot_1.gif" class="drag"><br>
    <img src="maps/dot_2.gif" class="drag"><br>
    <img src="maps/dot_3.gif" class="drag"><br>
    <img src="maps/dot_4.gif" class="drag"><br>
    <img src="maps/dot_5.gif" class="drag"><br>
    <img src="maps/dot_6.gif" class="drag"><br>

    <img src="maps/outlook_e_mail.jpg">
    </body>

</html>

Men jeg mangler en funktion der kan give mig positionen på de 6 giffer når de er sat på imaget? (som jeg så skal gemme i DBén)

..
Avatar billede crazysnap Seniormester
03. juli 2007 - 11:09 #3
Hej artico,

Nu aner jeg jo ikke hvordan du havde tænkt dig at gemme positioner og tilhørende text i databasen (PHP, ASP, ASP.NET?). Men jeg har lavet et eksempel til dig hvor du kan placere et uendeligt antal punkter på et billede og knytte noget tekst til punkterne. Når punkterne så gemmes ved at klikke på "Save" knappen, kan du trykke på "Grab all point coordinates and text"-knappen for at skrive koordinaterne ud. Du kan også klikke på et gemt punkt for at editere teksten eller måske slette det.

Hvis du ændrer pic og dot billederne (<img>-tags) til en sti på din computer kan du jo afprøve det og se om det kan hjælpe dig videre. Du kan jo udvide grabPoints() javascript metoden til at gøre lige præcis det du har brug for, for at kunne gemme punkterne i databasen.



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/TR/html401">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
        <script type="text/JavaScript">
       
        var arrPoints = new Array();
        var pointId = -1;
       
        function mouseclick(e, img)
        {
            if (!e) e = window.event;
           
            var posX = 0;
            var posY = 0;
           
            var imgPos = findPos(img);
           
            if(document.all) //IE
            {                   
                posX = e.offsetX;
                posY = e.offsetY;
            }
            else //FireFox
            {               
                posX = e.layerX - imgPos[0]-1;
                posY = e.layerY - imgPos[1]-1;
            }
             
            placeDot(posX, posY, imgPos); 
        }
       
        function placeDot(posX, posY, imgPos)
        {
            var elmDot = document.getElementById("positionNode").cloneNode(true);
           
            elmDot.id = elmDot.id + (++pointId).toString();
            elmDot.style.left = (imgPos[0] + posX).toString() + "px";
            elmDot.style.top = (imgPos[1] + posY).toString() + "px";
           
            //Setup events
            getElement(elmDot, "btnSave").onclick = function() { savePoint(elmDot); };
            getElement(elmDot, "btnRemove").onclick = function() { removePoint(elmDot); };
            getElement(elmDot, "dot").onclick = function() { dotClick(elmDot); };
           
            getElement(elmDot, "xyCoords").lastChild.nodeValue = posX + "," + posY;
           
            elmDot.style.visibility = "visible";
           
            document.getElementById("container").appendChild(elmDot);
        }
       
        function savePoint(div)
        {     
          getElement(div, "contents").style.visibility = "hidden"; 
           
          for(var i = 0; i < arrPoints.length; i++)
              if(div.id == arrPoints[i])
                  return;
       
          arrPoints[arrPoints.length] = div.id;
        }
       
        function removePoint(div)
        {
          var arrNew = new Array();
         
          for(var i = 0; i < arrPoints.length; i++)
              if(div.id != arrPoints[i])
                  arrNew[arrNew.length] = arrPoints[i];
         
          arrPoints = arrNew;
             
          div.parentNode.removeChild(div);
        }
       
        function dotClick(div)
        {
          getElement(div, "contents").style.visibility = "visible";
        }
       
       
        function grabPoints()
        {
            var output = document.getElementById("output");
            output.value = "";
           
            for(var i = 0; i < arrPoints.length; i++)
            {
                var strPointData = pointToString(document.getElementById(arrPoints[i]));
             
                if(i != 0)
                    output.value += "\n";
                   
                output.value += strPointData;
            }
        }
       
        function pointToString(div)
        {
            var arrPos = getElement(div, "xyCoords").lastChild.nodeValue.split(",");
            var strText = getElement(div, "textInput").value;
           
            var strReturn = "(" + arrPos[0] + ", " + arrPos[1] + ")" + " | " + strText;           
            return strReturn;
        }
       
       
        //------------- auxilery methods -----------------
        //Returns the position of an object
        function findPos(obj)
        {
            var curleft = curtop = 0;
            if (obj.offsetParent)
            {
                curleft = obj.offsetLeft;
                curtop = obj.offsetTop;
               
                while (obj = obj.offsetParent)
                {
                    curleft += obj.offsetLeft;
                    curtop += obj.offsetTop;
                }
            }
           
            return [curleft,curtop];
        }
       
        var returnElm;
        function getElement(elm, id)
        {
            returnElm = null;
           
            getElm(elm, id);
            return returnElm;
        }
       
        function getElm(elm, id)
        {
            if(elm.id == id)     
                returnElm = elm;
               
            for(var i = 0; elm.childNodes[i] && returnElm == null; i++)
                getElm(elm.childNodes[i], id);   
        }
       
        </script>
    </head>
    <body>
        <table>
            <tr>
                <td>Click on the picture to add a point</td>
            </tr>
            <tr>
                <td>
                    <input type="button" value="Grab all point coordinates and text" onclick="grabPoints();" />
                </td>
            </tr>
            <tr>
                <td>
                    <textarea id="output" cols="4" rows="6" style="width: 500px;" ></textarea>
                </td>
            </tr>
            <tr>
                <td>
                    <img id="pic" src="world-map.bmp" onclick="mouseclick(event, this);" alt="" />
                </td>
            </tr>
        </table>
       
        <div id="positionNode" style="position: absolute; width: 150px; visibility:hidden;" >
            <table width="100%">
                <tr>
                    <td>
                        <img id="dot" width="10" height="10" src="pic1.jpg" alt="Click to edit details" style="cursor: hand;" />
                    </td>
                    <td>
                        <div id="xyCoords" style="visibility: hidden;">&nbsp;</div>
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <table id="contents" style="width: 100%;" cellpadding="0" cellspacing="0">
                            <tr>
                                <td colspan="2">
                                    <input id="textInput" type="text" style="width: 100%;" />
                                </td>
                            </tr>
                            <tr >
                                <td align="left" style="width: 1%;"><input id="btnSave" type="button" value="Save"/></td>
                                <td style="width: 99%;"><input id="btnRemove" type="button" value="Remove"/></td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>
        </div>
        <div id="container"></div>
    </body>
</html>


Håber det hjælper dig videre... :)


Mvh.

- Snap :)
Avatar billede artico Novice
03. juli 2007 - 12:39 #4
Det er lige hvad jeg manglede.. 1000 Tak! Jeg arbejder videre, lige et sidste spm. Jeg vil gerne afsætte forskellige grafik "punkter" du ved... et 1,2,3.. tal i en ring for hvert punkt jeg afsætter?


Det er super godt det her!!!
p.s Jeg arbejder med PHP/Mysql så jeg laver txtaera om til seperate input felter, så kordinater kan blive gemt med det aktuelle billede....
Avatar billede olebole Juniormester
03. juli 2007 - 13:23 #5
<ole>

Du kan også udnytte, at <input type="image"> har lidt sjove egenskaber. Prøv denne kode:


<script type="text/javascript">
function setDot(oFr) {
    var aTmp, o = {}, sLoc = oFr.contentWindow.location.toString();
    if (sLoc.indexOf("test.html")!=-1) {
        var aSearch = sLoc.split("?")[1].split("&");
        for (var i=0,j=aSearch.length; i<j; i++) {
            aTmp = aSearch[i].split("=");
            if (aTmp[0]=="x") o.x = aTmp[1];
            if (aTmp[0]=="y") o.y = aTmp[1];
        }
        oImg = oDot.cloneNode(true);
        oSpan.appendChild(oImg);
        oImg.style.left = (o.x-(oImg.offsetWidth/2)) + "px";
        oImg.style.top = (o.y-(oImg.offsetHeight/2)) + "px";
    }
}

var oDot = oSpan = null;
window.onload = function(){
    oSpan = document.getElementById("mySpan");
    oDot = document.createElement("img");
    oDot.setAttribute("src", "dot.gif");
    oDot.style.position = "absolute";
}
</script>

<form action="test.html" target="loadFr">
    <span id="mySpan" style="position:relative">
        <input type="image" src="elogo.png">
    </span>
</form>

<iframe name="loadFr" style="display:none" onload="setDot(this)"></iframe>

- bytter du 'test.html' ud med et PHP- eller ASP-dokument, kan du opsamle x- og y-værdierne for hvert klik. Du kan også gemme koordinaterne og skyde dem af på én gang til slut  =)

/mvh
</bole>
Avatar billede crazysnap Seniormester
03. juli 2007 - 16:05 #6
Hej artico,


Det komplicerer det en lille smule at skulle have et nyt billed på hver gang. Det i sig selv er nemt nok, men hvad hvis man sletter et tilfældigt punkt og derefter tilføjer et nyt, hvilket nummer gif skal det så have?

Så for at skære problemstillingen ud i pap:

1) Man indsætter punkt 1, 2, 3 og 4.
2) Sletter punkt 2 og 3.
3) Indsætter et nyt punkt. -> Skal det så hedde 2, 3 eller 5?


Så hvis du skriver hvordan du præcis havde forestillet dig det skulle foregå så kan vi tage den derfra. Man kunne jo eventuelt ændre det så man kun kan slette det sidste punkt man tilføjede?

Skal brugeren også kunne sætte flere punkter en der er billeder til? Og i så fald, hvad skal der så ske når et sådan punkt indsættes? (skal den måske starte fra første gif igen?)


Mvh.

- Snap :)
Avatar billede artico Novice
03. juli 2007 - 17:41 #7
Der er kun 1 person (mig) der skal sætter punkter på et img :-) (Det er til nogle PDA manualer) Og der bliver max. 10 punkter altså 1,2,3,4,5....10 grafik punkter pr. img der skal indsættes, iden var så at gemme "pda_skarm_1.jpg" sammen med punkterne i DBén så jeg kunne genbruge "pda_skarm_1.jpg" med nogle andre punkter som jeg afsatte anderledes til en anden manual... osv..

Så hvis man f.eks indsætter alle punkter på et img, og sletter punkt 2 så er det kun punkt 2 man kan indsætte igen..osv...
Avatar billede crazysnap Seniormester
03. juli 2007 - 21:24 #8
Hej artico,


Så har jeg udviddet scriptet efter din beskrivelse ovenfor og rettet et par bugs (man kunne bla. ikke indsætte punkterne lige ved siden af hinanden). Så prøv det nye script nedenfor, du skal bare udvide arrDots array'et (i starten af javascriptet) efter samme struktur som jeg har gjort (der er 4 punkt-billeder i lige nu).
Der kan max indsættes det antal punkter som der er punkt-billeder i array'et. Slettes et punkt eller flere skal de genindsættes igen før der kan indsættes nye punkter.



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/TR/html401">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
        <script type="text/JavaScript">
       
        //Indsæt punkt-billederne her i kronologisk rækkefølge.
        var arrDots = Array("dot_1.gif", "dot_2.gif", "dot_3.gif", "dot_4.gif");
       
       
        var arrPoints = new Array();
        var arrDels = new Array();
        var pointId = 0;
       
        function mouseclick(e, img)
        {
            if (!e) e = window.event;
           
            var posX = 0;
            var posY = 0;
           
            var imgPos = findPos(img);
           
            if(document.all) //IE
            {                   
                posX = e.offsetX;
                posY = e.offsetY;
            }
            else //FireFox
            {               
                posX = e.layerX - imgPos[0]-1;
                posY = e.layerY - imgPos[1]-1;
            }
             
            placeDot(posX, posY, imgPos); 
        }
       
        function placeDot(posX, posY, imgPos)
        {
            var elmDot = document.getElementById("positionNode").cloneNode(true);
            var id = -1;
           
            if(pointId >= arrDots.length && arrDels.length == 0)
            {
                alert("No more points to place!");
                return;
            }
           
            if(arrDels.length == 0)
                id = pointId++;
            else
            {
                id = arrDels[arrDels.length-1];
                arrDels = removeLastArrayItem(arrDels);
               
            }
           
            elmDot.id = elmDot.id + "|" + id;
           
            elmDot.style.left = (imgPos[0] + posX).toString() + "px";
            elmDot.style.top = (imgPos[1] + posY).toString() + "px";
           
            //Setup events
            getElement(elmDot, "btnSave").onclick = function() { savePoint(elmDot); };
            getElement(elmDot, "btnRemove").onclick = function() { removePoint(elmDot); };
            var imgElm = getElement(elmDot, "dot");
            imgElm.onclick = function() { dotClick(elmDot); };
            imgElm.src = arrDots[id];
           
            getElement(elmDot, "xyCoords").lastChild.nodeValue = posX + "," + posY;
           
            elmDot.style.display = "block";
           
            document.getElementById("container").appendChild(elmDot);
        }
       
        function savePoint(div)
        {     
          getElement(div, "contents").style.display = "none"; 
           
          for(var i = 0; i < arrPoints.length; i++)
              if(div.id == arrPoints[i])
                  return;
       
          arrPoints[arrPoints.length] = div.id;
        }
       
        function removePoint(div)
        {
          var arrNew = new Array();
         
          for(var i = 0; i < arrPoints.length; i++)
              if(div.id != arrPoints[i])
                  arrNew[arrNew.length] = arrPoints[i];
         
          arrPoints = arrNew;
             
          arrDels[arrDels.length] = parseInt(div.id.split("|")[1]);
          div.parentNode.removeChild(div);
        }
       
        function dotClick(div)
        {
          getElement(div, "contents").style.display = "block";
        }
       
       
        function grabPoints()
        {
            var output = document.getElementById("output");
            output.value = "";
           
            arrPoints.sort(sortPoints);
           
            for(var i = 0; i < arrPoints.length; i++)
            {
                var strPointData = pointToString(document.getElementById(arrPoints[i]));
               
                if(i != 0)
                    output.value += "\n";
                   
                output.value +=  strPointData;
            }
        }
       
        function pointToString(div)
        {
            var pointNr =  parseInt(div.id.split("|")[1]) + 1;
            var arrPos = getElement(div, "xyCoords").lastChild.nodeValue.split(",");
            var strText = getElement(div, "textInput").value;
           
            var strReturn = pointNr + ". (" + arrPos[0] + ", " + arrPos[1] + ")" + " | " + strText;           
            return strReturn;
        }
       
       
        //------------- auxilery methods -----------------
        //Returns the position of an object
        function findPos(obj)
        {
            var curleft = curtop = 0;
            if (obj.offsetParent)
            {
                curleft = obj.offsetLeft;
                curtop = obj.offsetTop;
               
                while (obj = obj.offsetParent)
                {
                    curleft += obj.offsetLeft;
                    curtop += obj.offsetTop;
                }
            }
           
            return [curleft,curtop];
        }
       
        function sortPoints(a,b)
        {
            return(parseInt(a.split("|")[1])-parseInt(b.split("|")[1]))
        }

       
        var returnElm;
        function getElement(elm, id)
        {
            returnElm = null;
           
            getElm(elm, id);
            return returnElm;
        }
       
        function getElm(elm, id)
        {
            if(elm.id == id)     
                returnElm = elm;
               
            for(var i = 0; elm.childNodes[i] && returnElm == null; i++)
                getElm(elm.childNodes[i], id);   
        }
       
        function removeLastArrayItem(arr)
        {
            var arrNew = new Array();
           
            for(var i = 0; i < arr.length-1; i++)
                arrNew[arrNew.length] = arr[i];
           
            return arrNew;
        }       
        </script>
    </head>
    <body>
        <table>
            <tr>
                <td>Click on the picture to add a point</td>
            </tr>
            <tr>
                <td>
                    <input type="button" value="Grab all point coordinates and text" onclick="grabPoints();" />
                </td>
            </tr>
            <tr>
                <td>
                    <textarea id="output" cols="4" rows="6" style="width: 500px;" ></textarea>
                </td>
            </tr>
            <tr>
                <td>
                    <img id="pic" src="world-map.bmp" onclick="mouseclick(event, this);" alt="" />
                </td>
            </tr>
        </table>
       
        <div id="positionNode" style="position: absolute; width: 150px; display:none;" >
            <img id="dot" width="15" height="15" src="" alt="Click to edit details" style="cursor: hand;" />
            <table width="100%"> 
                <tr>
                    <td>
                        <table id="contents" style="width: 90%; background-color: Silver; border: solid 1px black;" cellpadding="2" cellspacing="0">
                            <tr>
                                <td colspan="2" align="center">
                                    <input id="textInput" type="text" style="width: 90%;" />
                                </td>
                            </tr>
                            <tr >
                                <td align="left" style="width: 1%;"><input id="btnSave" type="button" value="Save"/></td>
                                <td style="width: 99%;"><input id="btnRemove" type="button" value="Remove"/></td>
                            </tr>
                        </table>
                    </td>
                    <td><div id="xyCoords" style="display: none;">&nbsp;</div></td>
                </tr>
            </table>
        </div>
        <div id="container"></div>
    </body>
</html>


Håber det er tættere på hvad du søgte! :)


Mvh.

- Snap :)
Avatar billede artico Novice
04. juli 2007 - 16:40 #9
Det var lige noget jeg kunne bruge, har lige et sidste spm.: Hvordan "fisker" jeg de opsamlede data ud .. dem der havner i txtaera, så jeg kan bruge dem i PHP?

Og så send et svar, og jeg klarer mig selv :-) 1000 Tak!
Avatar billede crazysnap Seniormester
04. juli 2007 - 17:07 #10
Hej artico,


Nu er jeg ikke den store PHP haj, men jeg ved da at hvis du submitter siden (ved at tilføje en ny submit-knap) efter at have trykket på "Grab all point coordinates and text"-knappen kan du tilgå textarea indholdet i php med f.eks:

<?php
echo $_POST['TextAreaNavn'];
?>


Ellers må du lige poste et spørgsmål ovre i PHP afdelingen om hvordan man får tekst fra et textarea over i en PHP-variabel. :)


Mvh.

- Snap :)
Avatar billede artico Novice
04. juli 2007 - 17:21 #11
OKI.... 1000 TAK!
Avatar billede crazysnap Seniormester
04. juli 2007 - 18:38 #12
Glad for jeg kunne hjælpe! :)


Held og lykke med det og tak for pointene!
(Endelig skriv hvis der er noget)


Mvh.

- Snap :)
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