Visar inlägg med etikett dynamisk bild. Visa alla inlägg
Visar inlägg med etikett dynamisk bild. Visa alla inlägg

01 november, 2008

Javascript: Ändra bakgrundsbild dynamiskt på en webbsida

Javascript är ett smidigt skriptspråk när man vill ändra saker på en webbsida. Eftersom allt som visas på sidan är objekt så kan man komma åt dessa och ändra egenskaperna via Javascript. Det vi ska göra nu är att ändra en bild dynamiskt till vad vi vill.

Varför vill man göra detta?
Tänk dig att du t.ex har en webbsida som använder en CSS stilmall för att sköta design och layout. På sidan finns följande div-tagg innanför <body>:

filnamn: index.html
<div id="pageHeader">Titel här</div>

som innehåller en bakgrundsbild med följande kod inkluderad i stilmallen:

filnamn: styles.css
#pageHeader {
background-image: url(/images/headers/bigblue.png);
}

Då har alla undersidor med det div-ID samma bakgrundsbild och det kan vara lite krångligt att ändra manuellt. Då kom jag på att man kan ange i koden för den aktuella webbsidan en sökväg till den bild man vill ha som bakgrundsbild som då används istället för originalbilden.

Detta är användbart i följande exempel: Du har t.ex en webbsida om ett populärt resmål men vill även ha en undersida som innehåller historia om resmålet. Då tycker du att det hade passat med en annan bild som visar hur området såg ut förr.

Hur Javascriptet fungerar
Skriptet fungerar som så att det söker igenom den aktuella webbsidan efter ett unikt ID som innehåller en sökväg till en bild som ska byta ut den som redan visas på sidan. Om inget ID hittas så lämnas originalet oförändrad.

Placera följande kod som inkluderar skriptet innan taggen :
<script type="text/javascript" src="changeheader.js"></script>

Här är koden för skriptet:

filnamn: changeheader.js

//
// cross browser getElementById()
// -- väldigt smidigt sätt men det finns andra implementeringar --
function getObject(id) {
var object = null;
if( document.layers ) {
object = document.layers[id];
} else if( document.all ) {
object = document.all[id];
} else if( document.getElementById ) {
object = document.getElementById(id);
}
return object;
}

/**
* En funktion för cross-browser kompatiblititet när vi lägger till
* events på sidan.
* Den stödjer endast javascript funktioner som har 'on'
* framför (t.ex onLoad).
*/
function addEvent(element, evType, func, useCapture)
{
// Firefox?
if (element.addEventListener)
{
element.addEventListener(evType, func, useCapture);
return true;
}
// Internet Explorer?
else if (element.attachEvent)
{
var ret = element.attachEvent("on"+evType, func);
return ret;
}
else
{
// Visa ett meddelande för besökaren att webbläsaren
// måste uppgraderas för att stödja javascript
// funktionalitetet fullt ut.
var msg = "Your webbrowser doesn't support the Javascript used on this page.\n";
msg += "Please upgrade to be able to use full functionality.\n\n";
msg += "//Staff";
alert(msg);
}
}

//
// Change the headerbackground image
// -- Här är den specifika koden som ändrar bakgrunden --
//
// Copyright &copy 2008 - Waschman
// License: Open Source
//
function changeHeader()
{
// The div-header
headerBox = getObject("headerBox");
// The div that contains the path
headerPlaceholder = getObject("dynamicHeaderImage");

// Did we fint the right object?
if (headerPlaceholder == null) {
/*alert("Skriptet vet inte vilken bild som ska användas som sidhuvud!\nVar vänlig kontakta support");*/
return false;
}

// Get the path
pathToImage = headerPlaceholder.innerHTML;

// uncomment to hide placeholder if no inline-css is used
//headerPlaceholder.style.display = "none";

// change image
headerBox.style.backgroundImage = "url("+ pathToImage +")";
}

//
// Body onload
// -- Denna kod kör funktionen “changeHeader” vid body onLoad --
addEvent(window, "load", changeHeader);

Så, det var koden och nu återstår bara att lägga in följande kodsnutt innanför <body> som aktiverar ändringen. Tänk på att bara lägga in denna kod på de sidor som du vill ska ha en specifik bakgrundsbild som "header".

filnamn: historia.html
<div id="dynamicHeaderImage" style="display: none">/images/headers/new_header_red.png</div>

Det är här ni anger vilken ny bild ni vill använda. För att se ett exempel kan ni ladda ner ett komprimerat zip-paket med några testfiler.


(Tillägg 25/7-09) Flytande ramar - IFrame
Om man vill kunna komma åt dynamicHeaderImage som är placerad i en iframe, från huvudsidan, kan man använda följande changeheader.js istället.

Varning!
Observera att koden inte riktigt fungerar som den ska. Allt fungerar förutom att man måste ladda om index sidan manuellt för att bakgrundsbilden ska visas. Detta för att changeHeader() körs vid body onload(). Om något vet hur man fixar detta så skriv gärna en kommentar.

Filnamn: changeheader.js
Beskrivning: Används endast för de som använder iframes. Inte testad med vanliga ramar.
//
// cross browser getElementById()
// -- väldigt smidigt sätt men det finns andra implementeringar --
function getObject(id) {
var object = null;
if( document.layers ) {
object = document.layers[id];
} else if( document.all ) {
object = document.all[id];
} else if( document.getElementById ) {
object = document.getElementById(id);
}
return object;
}

function getIframeObject(oIframe, id) {

var newIframe = getObject(oIframe);
var innerDoc = newIframe.contentDocument || newIframe.contentWindow.document;

if( innerDoc.layers ) {
object = innerDoc.layers[id];
} else if( innerDoc.all ) {
object = innerDoc.all[id];
} else if( innerDoc.getElementById ) {
object = innerDoc.getElementById(id);
}
return object;
}

/**
* En funktion för cross-browser kompatiblititet när vi lägger till
* events på sidan.
* Den stödjer endast javascript funktioner som har 'on'
* framför (t.ex onLoad).
*/
function addEvent(element, evType, func, useCapture)
{
// Firefox?
if (element.addEventListener)
{
element.addEventListener(evType, func, useCapture);
return true;
}
// Internet Explorer?
else if (element.attachEvent)
{
var ret = element.attachEvent("on"+evType, func);
return ret;
}
else
{
// Visa ett meddelande för besökaren att webbläsaren
// måste uppgraderas för att stödja javascript
// funktionalitetet fullt ut.
var msg = "Your webbrowser doesn't support the Javascript used on this page.\n";
msg += "Please upgrade to be able to use full functionality.\n\n";
msg += "//Staff";
alert(msg);
}
}

//
// Change the headerbackground image
// -- Här är den specifika koden som ändrar bakgrunden --
//
// Copyright © 2008 - Waschman
// License: Open Source
//
function changeHeader()
{
// The div-header
headerBox = getObject('headerBox');
// The div that contains the path
headerPlaceholder = getIframeObject('iframeContent', 'dynamicHeaderImage');

// Did we fint the right object?
if (headerPlaceholder == null) {
//alert("Skriptet vet inte vilken bild som ska användas som sidhuvud!\nVar vänlig kontakta support");
return false;
}

// Get the path
pathToImage = headerPlaceholder.innerHTML;

// uncomment to hide placeholder if no inline-css is used
//headerPlaceholder.style.display = "none";

// change image
headerBox.style.backgroundImage = "url("+ pathToImage +")";
}

//
// Body onload
// -- Denna kod kör funktionen “changeHeader” vid body onLoad --
addEvent(window, "load", changeHeader);

Använd denna kod för att visa iframe:
<iframe id="iframeContent" name="iframeContent"></iframe>

Koden är nästan likadan som den förra men funktionen 'changeHeader' har modifierats och en ny funktion 'getIframeObject' har lagts till.

Lycka till!

23 juli, 2006

PHP: Skriv text till bild med GD2

Förord
Hmm, klockan är 03:43 och jag är för pigg för att lägga mig. Kan inte förstå varför jag känner så, men jag blir nog tröttare efter att ha skrivit en liten artikel :).
Den här artikeln kommer handla om hur man skriver text till bilder i PHP. Ni kanske har sett bilder på forum som visar information om er dator; typ vilken IP-adress eller vilken Internet Leverantör (ISP) ni har. Nu kommer ni får lära er hur man visar en besökares IP-adress.


Introduktion
För att kunna hänga med i artikeln och förstå någorlunda vad jag talar om, behöver ni kunna lite PHP. Grundläggande kunskaper räcker, men ni ska helst ha vana för programmering.

Det som gör att vi kan skapa dynamiska bilder i PHP är ett bibliotek vid namn GD2 (php_gd2.dll). De som har läst min artikel om hur man "Sätter upp en egen server" har redan GD2 konfigurerat och klart. Ni andra får ta reda på om ni har det på ert webbhotel eller om ni har det på er server innan ni börjar.

Vill ni läsa lite mer om bibiloteket GD2 eller ladda ner det till er server, rekommenderar jag att ni besöker www.boutell.com/gd.

Jag tänker inte gå igenom i detalj hur ni skapar PHP-dokument för det borde ni kunna fixa på egen hand.


Då börjar vi
Börja med att leta fram den bild du vill använda. Ni kan använda den bifogade bilden om ni vill för det är den jag har använt.



Öppna sedan ett nytt PHP-dokument och skriv följande kod:

<?php
// Hämta bilden som ska visas
// Observera att bildtypen måste vara av typen PNG (mime: image/png)
$img = imagecreatefrompng('C:/bilder/sunset_small.PNG');


Nu har vi öppnat bilden och lagrat en referens till den i en variabel $img. I nästa kodsnutt definierar vi de färger vi vill kunna använda till texten:

// Definiera färger
// Vi använder RGB-värden från 0-255 (röd, grön, blå)
$black = imagecolorallocate($img, 0, 0, 0);
$white = imagecolorallocate($img, 255, 255, 255);
$blue = imagecolorallocate($img, 0, 0, 200);
$red = imagecolorallocate($img, 200, 0, 0);


Sedan sätter vi storleken på texten till den inbyggda storleken 3. Det finns följande storlekar för de som vill testa sig fram: 1 (minst), 2, 3, 4 och 5 (störst).

// Sätt en inbyggd teckenstorlek för imagestring()
$font = 3;


Nu anger vi x- och y koordinaterna på bilden där vi vill att textens övre vänstra hörn ska börja. Om ni använder en annan bild än den bifogade så måste ni naturligtvis ändra på koordinaterna. Kom bara ihåg att koordinaten (0, 0) i GD2 biblioteket (och på flera andra ställen) börjar längst upp till vänster på alla bilder:

// Ange koordinater där texten ska börja
$x = 125;
$y = 160;


Nu väljer vi den text som vi vill skriva till bilden. Det är en ledtext och besökarens IP-adress som slås ihop till en ända sträng:

// Skriv den text ni vill ska användas
$text = 'Du har IP: ';
$ip = $_SERVER['REMOTE_ADDR']; // Lagra IP-adress
$text .= $ip;


Nu ligger hela texten lagrad i variabeln $text så nu kan vi skriva den till bilden med referensen $img. Ni kan byta ut variabeln $white (vit) mot någon annan av de färger vi definierade i början av koden:

// Skriv texten till bilden
imagestring($img, $font, $x, $y, $text, $white);


Vi använder funktionen imagestring för att använda referensen $img, med textstorleken $font, koordinaten $x och $y (125, 160), texten $text och färgen $white.

Nu måste vi bara tala om för webbläsaren att det kommer en PNG bild istället för en vanlig hemsida:

// Berätta för webbläsaren att det nu kommer en bild av typen png.
header('Content-type: image/png');

// Skicka bilden till webbläsaren
imagepng($img);


Slutligen så frigör vi minnet för att göra servern och systemadministratören glad:

// Frigör minne (viktigt!)
imagedestroy($img);
?>


Om ni använder ett annat format än PNG kan ni testa byta ut png i koden till ert format. GIF kan dock krångla pga licenser.


Testa
Spara nu PHP-dokumentet som "dynamisk_bild.php" och kör den på den server ni använder.


Slutord
Hoppas ni fick det att fungera och att ni har lärt er något nytt ;)
Nu är jag väldigt trött och ska gå och lägga mig!

Zzz Zzz


Källor
www.boutell.com/gd
www.php.net/gd

Välkomna till bloggen

Välkomna ska ni vara kära besökare. Jag skriver om IT för att det är kul och för att jag vill dela med mig av information och kunskap. Jag försöker hålla bloggen så kategoriserad som möjligt för att ni enklare ska hitta intressanta länkar och artiklar.