Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP]Afbeelding uit database omzetten in variable

Pagina: 1
Acties:

Onderwerpen


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Ik haal een afbeelding uit een database als blob in het bestand get.php, en zet get.php om naar png bestand. Ik wil het plaatje echter eerst watermerken voordat ik die toon door gebruik te maken van de functie watermerk_afbeelding. Probleem is dat in mijn functie de meegestuurde variabel als string ziet als ik daar de mime info uit wil halen. Zonder de functie watermerk_afbeelding wordt de afbeelding netjes getoond, dus get.php werkt gewoon.

PHP:
1
2
3
4
5
6
7
8
9
<?php
include 'watermerk.php';

$afbeelding = "get.php";
watermerk_afbeelding($afbeelding);

echo "<img src='$afbeelding' />";

?>


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

function watermerk_afbeelding($afbeelding)
{
    $info = getimagesize($afbeelding);
    
    switch ($info['mime'])
    {
        case 'image/jpeg':
            $main = imagecreatefromjpeg($afbeelding);
            break;
        case 'image/png':
            $main = imagecreatefrompng($afbeelding);
            break;
        case 'image/gif':
            $main = imagecreatefromgif($afbeelding);
            break;
        default:
            return false;
    }
    
    imagealphablending ($main, true);
    
    $overlay = imagecreatefrompng("watermerk.png");
    
    imagecopy($main, $overlay, 5, 5, 0, 0, imagesx($overlay), imagesy($overlay));
    
    imagepng($main);
}
?>

  • DizzyWeb
  • Registratie: Februari 2001
  • Nu online

DizzyWeb

Ondertiteld

Even logisch nadenken, wat moet je aan het "src" attribuut van de img tag meegeven?

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
WEB >> PRG

Verder: wat heb je zelf al geprobeerd? Heb je al gedebugged? (Debuggen: Hoe doe ik dat?). Ik mis hier namelijk nogal wat eigen inzet en zie eigenlijk niet veel meer dan *dit is mijn code, kwak, kwak, en 't werkt niet*. Tip voor een volgende keer als je een topic opent: hanteer dan even onze Quickstart. Voor nu laat ik dit topic open, maar zou ik graag zien dat je je topicstart van de nodige extra informatie voorziet ;) Gebruik daarvoor de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ).

[ Voor 89% gewijzigd door RobIII op 19-09-2011 20:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
DizzyWeb schreef op maandag 19 september 2011 @ 20:41:
Even logisch nadenken, wat moet je aan het "src" attribuut van de img tag meegeven?
De link naar de image, maar snap niet waarop je doelt. getimagesize ziet $afbeelding als string en niet als afbeelding.
RobIII schreef op maandag 19 september 2011 @ 20:47:
Waar hoort mijn topic?
WEB >> PRG

Verder: wat heb je zelf al geprobeerd? Heb je al gedebugged? (Debuggen: Hoe doe ik dat?). Ik mis hier namelijk nogal wat eigen inzet en zie eigenlijk niet veel meer dan *dit is mijn code, kwak, kwak, en 't werkt niet*. Tip voor een volgende keer als je een topic opent: hanteer dan even onze Quickstart. Voor nu laat ik dit topic open, maar zou ik graag zien dat je je topicstart van de nodige extra informatie voorziet ;) Gebruik daarvoor de edit knop ( [afbeelding] ).
Excuus. De error die ik krijg bij het debuggen is: Warning: getimagesize(get.php?id=11) [function.getimagesize]: failed to open stream: No error in C:\xampp\htdocs\phptest\watermerk.php on line 5. Wat ik daar uit afleid is dat de $afbeelding wordt gezien als string en niet als image. Ik heb naar manieren gezocht om die in de main.php bestand die om te zetten naar een image maar niks werkte. Wat ik wel raar vind is dat als ik de variable in een img tag zet die wel werkt.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:53

Creepy

Tactical Espionage Splatterer

Een string meegeven aan een functie die toevallig eindigt op .php zorgt er niet magisch voor dat die .php wordt uitgevoerd ;) Waarom denk jij dat dat wel zo is? Waarom laat je je get.php niet gewoon zelf het watermerk genereren als get.php toch al een image naar buiten gooit?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

A-Square schreef op maandag 19 september 2011 @ 20:39:
Ik haal een afbeelding uit een database als blob in het bestand get.php, en zet get.php om naar png bestand. Ik wil het plaatje echter eerst watermerken voordat ik die toon door gebruik te maken van de functie watermerk_afbeelding. Probleem is dat in mijn functie de meegestuurde variabel als string ziet als ik daar de mime info uit wil halen. Zonder de functie watermerk_afbeelding wordt de afbeelding netjes getoond, dus get.php werkt gewoon.
[knip]
Joh, een variabele (in dit geval wat binaire data) in een HTML elementje proppen werkt natuurlijk niet ;)
Je moet je watermerk.php includen binnen get.php.
Die (get.php) pas je dan aan zodattie de watermerkfunctie gebruikt tijdens het ophalen/outputten van de image file.

Dan roep je get.php in je HTML op als IMG element.

get.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
include ('watermerk.php');

//doe een hoop met een jpg file, zoals fopen en wat gdlib functies zoals resize

watermerk($variabele); //watermerkje er op plempen

header(); //header met JPG data er uit mikken

echo $variabele //JPEG data uitkotsen

exit(); // einde script


index.php:
PHP:
1
2
3
4
5
//hoop HTML
echo "<img src=\"get.php\">";

echo "<img src=\"get.php?img=blotechick.jpg\">"; // of met een GET variabele om je jpg bestand te roepen voor verwerking in get.php
//nog meer HTML

[ Voor 36% gewijzigd door McKaamos op 19-09-2011 21:53 ]

Iemand een Tina2 in de aanbieding?


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:53

Creepy

Tactical Espionage Splatterer

McKaamos: "get.php" is precies dat, een string met "get.php". Dus die in een src attribuut stoppen werkt wel degelijk. Mits get.php een image genereert en een image header naar buiten gooit, wat gezien de topicstart al wel werkt ;)

Wat niet werkt is "get.php?id=11" aan getimagesize meegeven. Die zoekt vervolgens een bestand met de naam "get.php?id=11" en die bestaat simpelweg niet. Mocht het bestand wel bestaan dan leest getimagesize het bestand in als image, niet als php code om uit te voeren.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Mjah, ik volg wat je bedoelt Creepy, maar ik denk niet dat de TS alleen maar "get.php" als image wil weergeven.
Blijkbaar moet er een watermerkje op de foto gezet worden, en dat werkt alleen als de output van get.php die watermerkfunctie gebruikt. Dus je moet watermerk.php includen in get.php, niet in je index.php (of whatever de file is waar je in werkt die uiteindelijk HTML moet uitspugen)

Dat is waar ik op doelde.
Puur de output van de watermerkfunctie in een IMG tag plempen gaat iig niet werken.
Of die watermerkfunctie nou een php file of een jpg file gebruikt is natuurlijk niet zo heel interessant. Zolang er maar image data uit komt.

[ Voor 23% gewijzigd door McKaamos op 19-09-2011 21:58 ]

Iemand een Tina2 in de aanbieding?


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Dit is de code van get.php (vergeten erbij te doen, excuus). Ik zal zo even jouw methode proberen McKaamos.

get.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 

include 'connect.php';

$id = mysql_real_escape_string($_REQUEST['id']);

$afbeelding = mysql_query("SELECT * FROM store WHERE id=$id");
$afbeelding = mysql_fetch_assoc($afbeelding);
$afbeelding = $afbeelding['afbeelding'];

header("Content-type: image/png");

echo  $afbeelding;

?>

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
A-Square schreef op maandag 19 september 2011 @ 22:28:
Dit is de code van get.php (vergeten erbij te doen, excuus). Ik zal zo even jouw methode proberen McKaamos.

get.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 

include 'connect.php';

$id = mysql_real_escape_string($_REQUEST['id']);

$afbeelding = mysql_query("SELECT * FROM store WHERE id=$id");
$afbeelding = mysql_fetch_assoc($afbeelding);
$afbeelding = $afbeelding['afbeelding'];

header("Content-type: image/png");

echo  $afbeelding;

?>
Heb je de binaire data van de afbeelding opgeslagen in je database...?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Tharulerz schreef op maandag 19 september 2011 @ 22:43:

Heb je de binaire data van de afbeelding opgeslagen in je database...?
Zou je dat niet willen dan?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Tharulerz schreef op maandag 19 september 2011 @ 22:43:
[...]


Heb je de binaire data van de afbeelding opgeslagen in je database...?
Ja, dat doe ik in een andere pagina waar je een plaatje kan uploaden.

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 26-11 20:53

Ventieldopje

I'm not your pal, mate!

P_de_B schreef op maandag 19 september 2011 @ 22:45:
[...]

Zou je dat niet willen dan?
Is niet geheel gebruikelijk, beter is de url naar plaatjes in de database opslaan en plaatjes op je web server opslaan in een aparte map (dit kan ook buiten je public_html dmv. fpassthru!)

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Ik snap dat het niet heel praktisch is, maar het betreft een testprojectje. Hoeft dus niet praktisch te zijn :P .

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Vroeger misschien, tegenwoordig zou ik dat niet meer doen. Moderne databases kunnen daar prima mee omgaan en je hebt direct je backup, security en referentiële integriteit goed geregeld als je het plaatje in de database stopt. Ik zou niet meer weten waarom je dat nu niet zou willen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 23-11 22:53
Misschien te makkelijk maar $afbeelding en $image door elkaar in het tweede snippet?

Daarnaast werkt getimagesize alleen op afbeeldingen. Lijkt me stug dat ie ook werkt met PHP bestanden die een plaatje teruggooien. Er wordt namelijk geen script uitgevoerd.

Edit: spuit 11, Creepy is me ruim voor :)

[ Voor 58% gewijzigd door Morrar op 19-09-2011 23:03 ]


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Morrar schreef op maandag 19 september 2011 @ 22:56:
Misschien te makkelijk maar $afbeelding en $image door elkaar in het tweede snippet?

Daarnaast werkt getimagesize alleen op afbeeldingen. Lijkt me stug dat ie ook werkt met PHP bestanden die een plaatje teruggooien. Er wordt namelijk geen script uitgevoerd.
Dat zag ik ook, heb dat ondertussen al veranderd, maar het porbleem speelt zich al daarvoor af. Bij getimagesize zoals jij al zei. Ik weet dus alleen niet hoe ik die teruggegooide plaatje kan fetchen in een variabele waar getimagesize wat mee kan.

Verwijderd

P_de_B schreef op maandag 19 september 2011 @ 22:53:
Vroeger misschien, tegenwoordig zou ik dat niet meer doen. Moderne databases kunnen daar prima mee omgaan en je hebt direct je backup, security en referentiële integriteit goed geregeld als je het plaatje in de database stopt. Ik zou niet meer weten waarom je dat nu niet zou willen.
Backup, deduplicatie? :)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
:? Backup wil toch ook prima als ze in de database staan, beter zelfs zou ik zeggen omdat je dan maar één bestand hoeft te backuppen (en te restoren). Deduplicatie kan ik niet echt plaatsen in deze contect.

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Maar één plaatje uit een backup restoren is wel een hels karwei met een grote database met veel afbeeldingen, terwijl het als los bestand in een bestandssysteem met de meeste backupplatforms een routineklusje is. Ook kun je met losse bestanden minder backupruimte gebruiken als je meerdere contentservers met (bijna) dezelfde plaatjes hebt.

Ik zeg niet dat je altijd het ene of altijd het andere moet gebruiken, dat ligt echt aan het precieze doel.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Verwijderd schreef op maandag 19 september 2011 @ 23:24:
Ik zeg niet dat je altijd het ene of altijd het andere moet gebruiken, dat ligt echt aan het precieze doel.
Dat is natuurlijk waar, ik reageerde vooral even omdat soms nog steeds vaak de gedachte leeft dat binaire bestanden niet in een db thuis horen terwijl daar ook juist een aantal belangrijk voordelen aan zitten :)

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

P_de_B schreef op maandag 19 september 2011 @ 23:26:

Dat is natuurlijk waar, ik reageerde vooral even omdat soms nog steeds vaak de gedachte leeft dat binaire bestanden niet in een db thuis horen terwijl daar ook juist een aantal belangrijk voordelen aan zitten :)
Absoluut. Het punt is alleen dat er meerdere zaken meespelen bij het maken van zo'n keuze. Vaak zie je bijvoorbeeld dat er voor zo'n oplossing met afbeeldingen uit een database het best ook gebruik kan worden gemaakt van bijvoorbeeld Varnish om grote hoeveelheden dataverkeer naar de databaseserver(s) te voorkomen. Dat kan aardig hard gaan soms en dat wil je niet altijd over een netwerkswitch sturen. Cachen kan dan grote voordelen opleveren.

En ook dat probleem heb je niet als je de afbeeldingen als bestand op een content server zet in plaats van in een database. Het controleren van modification time en het daarop baseren van HTTP headers t.b.v. caching gaat ook veel beter/sneller met losse bestanden.

Developers moeten ook soms een klein beetje rekening houden met server admins ;)

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 23-11 22:53
A-Square schreef op maandag 19 september 2011 @ 23:12:
[...]
Dat zag ik ook, heb dat ondertussen al veranderd, maar het porbleem speelt zich al daarvoor af. Bij getimagesize zoals jij al zei. Ik weet dus alleen niet hoe ik die teruggegooide plaatje kan fetchen in een variabele waar getimagesize wat mee kan.
Hmm waarom sla je beide plaatjes (origineel en watermerk) niet gewoon als bestand op? Dan kun je namelijk wel gewoon getimagesize gebruiken op het origineel. Je hele script is daar min of meer op gebaseerd, omdat je ook een imageobject moet maken in PHP om het watermerk er op te plakken.

Waarom wil je eigenlijk het origineel per se in een database stoppen? Als je een database gebruikt zul je de data eerst moeten omzetten naar een image-object in PHP. Ik denk dat je deze functie daarvoor kunt gebruiken:

http://www.php.net/manual...imagecreatefromstring.php
Zie comment: http://www.php.net/manual...reatefromstring.php#31178

De afmetingen zou ik ook gewoon in de database opslaan als je het plaatje in de database stopt (dan kun je namelijk wel getimagesize gebruiken).

Edit: nog even de flow van het script dan:

1) Haal blob op uit dbase en stop in zeg $imgdata
2) Maak imageobject $imgobj van $imgdata met imagecreatefromstring
3) Haal watermerk uit bestand met imagecreatefrompng en maak imageobject $merkobj
4) Gebruik imagecopy om $merkobj in $imgobj te plakken
5) stuur $imgobj naar de browser


P.S. Overigens lig ik al een paar jaar uit de webdev, dus wellicht weet iemand anders het beter :)

[ Voor 46% gewijzigd door Morrar op 19-09-2011 23:44 ]


  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

A-Square schreef op maandag 19 september 2011 @ 22:28:
Dit is de code van get.php (vergeten erbij te doen, excuus). Ik zal zo even jouw methode proberen McKaamos.

get.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 

include 'connect.php';

$id = mysql_real_escape_string($_REQUEST['id']);

$afbeelding = mysql_query("SELECT * FROM store WHERE id=$id");
$afbeelding = mysql_fetch_assoc($afbeelding);
$afbeelding = $afbeelding['afbeelding'];

header("Content-type: image/png");

echo  $afbeelding;

?>
Kijk, deze pas je dus aan als je de watermark er in wil hebben.

get.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php 

include 'connect.php';
include 'watermerk.php'; //dies nieuw erbij

$id = mysql_real_escape_string($_REQUEST['id']);

$afbeelding = mysql_query("SELECT * FROM store WHERE id=$id");
$afbeelding = mysql_fetch_assoc($afbeelding);
$afbeelding = $afbeelding['afbeelding'];

$afbeelding = watermerk($afbeelding); //hier voeg je het watermerk toe aan het plaatje uit de DB

header("Content-type: image/png");

echo  $afbeelding; //en dan kotst hij hier een plaatje met watermerk uit.

?>


Edit:
Ik zie net wel dat je dan in je watermerkfunctie even de imagepng opdracht er uit moet kijlen en daar "return $bla" van moet maken (waar bla de naam van de variabele ofcourse)

[ Voor 7% gewijzigd door McKaamos op 19-09-2011 23:35 ]

Iemand een Tina2 in de aanbieding?


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
McKaamos schreef op maandag 19 september 2011 @ 23:32:
[...]

Kijk, deze pas je dus aan als je de watermark er in wil hebben.

[...]

Edit:
Ik zie net wel dat je dan in je watermerkfunctie even de imagepng opdracht er uit moet kijlen en daar "return $bla" van moet maken (waar bla de naam van de variabele ofcourse)
Ik had dezelfde methode al gebruikt, maar zoals hierboven al werd verteld kan getimagesize daar niks mee. Het moet een reeds "opgeslagen" image (moet ergens in een directory bevinden) zijn wil getimagesize er wat mee kunnen.

En de watermerkfunctie had ik idd aangepast zodat die de afbeelding returnt in plaats van eentje direct output via imagepng. Ben nu ff aan het uitzoeken hoe ik dat ga doen (via een temp bestand misschien).

  • McKaamos
  • Registratie: Maart 2002
  • Niet online

McKaamos

Master of the Edit-button

Misschien eerst even weer naar PNG casten en dan in een variabele drukken die je dan voert aan je watermerkfunctie.
Dan heeftie iig weer een header met info zodat getimagesize er wat mee kan.

[ Voor 25% gewijzigd door McKaamos op 20-09-2011 00:13 ]

Iemand een Tina2 in de aanbieding?


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Heb dat ook uitgezocht, vond iets met base64_decode, maar heb het niet werkend gekregen.

Ik had get.php om het testen, maar tevergeefs, getimagesize weet er nog steeds geen raad mee. Hier is de code waarmee ik het testte:

get.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php 

include 'connect.php';
include 'watermerk.php';

//$id = mysql_real_escape_string($_REQUEST['id']);

$afbeelding = mysql_query("SELECT * FROM store WHERE id=20");
$afbeelding = mysql_fetch_assoc($afbeelding);
$afbeelding = $afbeelding['afbeelding'];

$afbeelding = base64_decode($afbeelding);

$afbeelding = watermerk_afbeelding($afbeelding);

//header("Content-type: image/jpg");

//echo $afbeelding;

?>

  • ixi
  • Registratie: December 2001
  • Laatst online: 21-11 21:40

ixi

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
include 'connect.php';

$id = mysql_real_escape_string($_REQUEST['id']); 
$afbeelding = mysql_query("SELECT * FROM `store` WHERE id=" . $id); 
$afbeelding = mysql_fetch_assoc($afbeelding);
$afbeelding = $afbeelding['afbeelding'];

$image = imagecreatefromstring($afbeelding);
imagealphablending($image, true);
$overlay = imagecreatefrompng("watermerk.png");
imagecopy($image, $overlay, 5, 5, 0, 0, imagesx($overlay), imagesy($overlay));

header("Content-type: image/png");
imagepng($image);


Mime type is redelijk overbodig als je imagecreatefromstring gebruikt. Als je binary data in de DB opslaat zou ik ook direct het mime type in de DB opslaan. Je hebt dan data en type bij elkaar staan, wel zo handig als je het in de toekomst nodig hebt. Via een temp bestand de mime type achterhalen kan, maar dat is wel een behoorlijk performance hit als je dat bij elk watermerk-image moet gaan doen (hoewel bovenstaande ook niet erg efficient is).

Afhankelijk van wat voor soort afbeeldingen je hebt kun je wellicht ook beter imagejpeg($image,null,80); doen ipv imagepng($image). Dat scheelt behoorlijk in bestandsgrootte bij normale foto's. Als het formaat hetzelfde moet blijven heb je wel weer het mime type van de orginele afbeelding nodig...

[ Voor 14% gewijzigd door ixi op 20-09-2011 01:35 ]


  • A-Square
  • Registratie: Maart 2009
  • Laatst online: 27-09 14:12
Probleem opgelost! imagecreatfromstring() is wat ik nodig had.
(stom dat ik die ik nu pas zie staan op php.net) :+

Bedankt voor de hulp iedereen!

[ Voor 8% gewijzigd door A-Square op 20-09-2011 11:50 ]

Pagina: 1