loop maken voor het inladen van afbeeldingen en het wijzigen van bestandsnaam
Dit gebeurd met behulp van TCPDF.
Ik laat de gebruiker via de editor van WordPress afbeeldingen plaatsen met vaste afbeeldingsgroottes.
In de export naar PDF moeten de afbeeldingen worden omgezet naar een Hoge resolutie variant. Hierbij verander ik simpelweg de bestandsnaam. bijvoorbeeld: image-150x150,jpg wordt image.jpg.
Hierbij kan de lage resolutie voor de website worden gebruikt en de hoge resolutie voor de PDF.
Als dit gebeurdis laat ik TCPDF de afbeelding resizen en exporteren.
Op de volgende manier:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
if (strpos($images[0],'-'.$s1.'x'.$s2.'')) {
$w = $s1; $w = $pdf->pixelsToUnits($w);
$h = $s2; $h = $pdf->pixelsToUnits($h);
$pdf->Image(str_replace('-'.$s1.'x'.$s2.'','',$images[0]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
?>
if (strpos($images[0],'-'.$s1.'x'.$s2.'')) {
$w = $s1; $w = $pdf->pixelsToUnits($w);
$h = $s2; $h = $pdf->pixelsToUnits($h);
$pdf->Image(str_replace('-'.$s1.'x'.$s2.'','',$images[0]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
?>
Dit werkt wel maar ik heb een wat dynamischere manier nodig.
Als er twee afbeeldingen worden geupload zijn er 9 verschillende afbeeldings groottes in combinatie mogelijk.
Ik vind het een beetje onzinnig om 1000 regels te schrijven voor iedere mogelijke combinatie.
Wat ik denk nodig te hebben is een functie die bekijkt welke afbeeldingsgrootte geplaatst is en die dan aanpast op het juiste formaat bij exporteren.
Ik dacht iets te hebben gevonden maar dit doet niet wat ik zou willen.
Onderstaand "loopt" door een array, maar geeft elke mogelijke optie weer. 9 dus.
Code (php)
Iemand een idee hoe ik dit in een loopje kan gieten waardoor er dus gekeken wordt hoeveel afbeeldingen er zijn. Aan de bestandsnaam zien welke grootte is gebruikt en dit kan weergeven :-)
M.
Gewijzigd op 16/02/2015 15:22:21 door Michel van B
Quote:
In de export naar PDF moeten de afbeeldingen worden omgezet naar een Hoge resolutie variant. Hierbij verander ik simpelweg de bestandsnaam. bijvoorbeeld: image-150x150,jpg wordt image.jpg.
Is image.jpg hierbij het origineel, dat verder niet gebruikt wordt, maar wel bewaard is om later andere (kleinere) formaten van te maken? Ik neem aan dat je niet de thumbnail weer opblaast?
Quote:
Wat ik denk nodig te hebben is een functie die bekijkt welke afbeeldingsgrootte geplaatst is en die dan aanpast op het juiste formaat bij exporteren.
Wat is "het juiste formaat"? In dezelfde verhouding? Maar die is nog steeds hetzelfde als het origineel lijkt mij? Of zijn er een vast aantal thumbnail formaten (150x150, 320x200, 250x250 bijvoorbeeld) die 1 op 1 omgezet moeten worden (met behulp van het origineel, niet van deze thumbnail) naar een nieuw -en vast- formaat?
Dat kun je simpel doen met een "mapping" via een array (<afmeting thumbnail in px> => <afmeting in PDF in units>), of ik begrijp niet wat je bedoelt :).
Quote:
Is image.jpg hierbij het origineel, dat verder niet gebruikt wordt, maar wel bewaard is om later andere (kleinere) formaten van te maken? Ik neem aan dat je niet de thumbnail weer opblaast?
Ja image.jpg is het origineel. Een hoge resolutie afbeelding die 300 dpi bevat.
TCPDF gebruikt deze abeelding in de export naar PDF.
Quote:
Wat is "het juiste formaat"? In dezelfde verhouding? Maar die is nog steeds hetzelfde als het origineel lijkt mij? Of zijn er een vast aantal thumbnail formaten (150x150, 320x200, 250x250 bijvoorbeeld) die 1 op 1 omgezet moeten worden (met behulp van het origineel, niet van deze thumbnail) naar een nieuw -en vast- formaat?
Het exporteren vanuit TCPDF gaat als volgt:
$pdf->Image(afbeeldingslocatie, nog, een, aantal, argumenten, DPI);
Op de "afbeeldingslocatie" doe ik een str_replace waarbij ik het opgegeven formaat verwijder en vervang met "niets". Hierdoor kan TCPDF de originele afbeelding gebruiken en omzetten naar het formaat dat de gebruiker heeft gebruikt om te plaatsen in de website.
Quote:
Dat kun je simpel doen met een "mapping" via een array (<afmeting thumbnail in px> => <afmeting in PDF in units>), of ik begrijp niet wat je bedoelt :).
Wat? :)
Toevoeging op 16/02/2015 15:19:25:
----------------------UPDATE--------------------
Ik heb het volgende werken.
Ik zou het op prijs stellen of iemand hier eventueel een verbetering aan zou kunnen geven. Dynamischer dan dit ga ik hem waarschijnlijk niet krijgen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$a = '-'.$s1.'x'.$s2.'';
$b = '-'.$s3.'x'.$s4.'';
$c = '-'.$s5.'x'.$s6.'';
for($d=0; $d <= count($images); $d++){
if(strpos($images[$d],$a)){
echo '$d = '.$d.' '.str_replace($a,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$b)){
echo '$d = '.$d.' '.str_replace($b,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$c)){
echo '$d = '.$d.' '.str_replace($c,'',$images[$d]).'<br>';
}
}
?>
$a = '-'.$s1.'x'.$s2.'';
$b = '-'.$s3.'x'.$s4.'';
$c = '-'.$s5.'x'.$s6.'';
for($d=0; $d <= count($images); $d++){
if(strpos($images[$d],$a)){
echo '$d = '.$d.' '.str_replace($a,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$b)){
echo '$d = '.$d.' '.str_replace($b,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$c)){
echo '$d = '.$d.' '.str_replace($c,'',$images[$d]).'<br>';
}
}
?>
Gewijzigd op 16/02/2015 15:21:31 door Michel van B
EDIT: wat je in feite wilt is een soort van patroon-herkenning? Daarvoor zijn reguliere expressies:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$filename = 'whatever-200x400.jpg';
$matches = array();
preg_match('#-(\d+)x(\d+).#', $filename, $matches);
var_dump($matches);
?>
$filename = 'whatever-200x400.jpg';
$matches = array();
preg_match('#-(\d+)x(\d+).#', $filename, $matches);
var_dump($matches);
?>
EDIT: Ah, ik begrijp nu ook je oorspronkelijke probleem waarschijnlijk: je wilt op een generieke manier de naam van de originele afbeelding bepalen door de resolutie eraf te kappen. Dat kan ook met een regexp functie:
Gewijzigd op 16/02/2015 15:35:44 door Thomas van den Heuvel
Thomas van den Heuvel op 16/02/2015 15:21:53:
Waar zit het probleem precies - zit dit in een gewenste controle die bepaalt hoeveel thumbnail-varianten (welke dimensie-combinaties) er zijn (en waarvoor wil je dit vervolgens gebruiken?), of een mechanisme dat bepaalt welke afmetingen een originele afbeelding moet krijgen in het PDF-document, of iets anders?
Een situatie schets:
Een gebruiker upload 2 afbeeldingen (high resolution).
Wordpress maakt daar 4 varianten van
1. het origineel
2. 150x150
3. 360x360
4. 620x620
Let op dat deze formaten in te stellen zijn. Deze staan er nu puur als voorbeeld.
Bij het plaatsen van de beelden in de editor kiest de gebruiker welke variant hij wilt gebruiken.
Nu staan er op de webpagina twee beelden van die een bepaald formaat heeft.
Nu wordt er op "export pdf" geklikt en moet er een PDF gemaakt gaan worden.
Deze PDF moet de hoge resolutie beelden bevatten van 300 DPI maar op het formaat dat de gebruiker ingesteld heeft.
Dit formaat kan ik uit de bestandsnaam halen. (image-150x150.jpg)
Ik vervang deze waarde met niets zodat de orignele afbeelding gebruikt wordt.
TCPDF maakt nu een pdf met de hoge resolutie afbeelding en het formaat wat de gebruiker op heeft gegeven.
Dit laatste (was) de uitdaging.
Ik weet niet welke waardes de gebruiker op heeft gegeven dus ik moet met alle mogelijkheden rekening houden. Het zou van de gekke zijn om deze allemaal uit te schrijven. (if/elseif of switch)
Dus zocht ik een dynamischere oplossing die in eerste instantie kijkt hoeveel beelden er zijn en hiervan de het formaat achterhalen uit de bestandsnaam en dit vervangen door niets. Hierna wordt de waarde van de bestandsnaam (150x150) toegekent aan TCPDF zodat deze weer weet hoe groot hij het beeld in de PDF moet opslaan.
Hoop dat dit allemaal duidelijk is. Ik snap dat het best lastig kan zijn om mij te begrijpen. Heb ik zelf ook last van :)
Ik heb inmiddels het volgende voor elkaar gebokst en dit werkt nu.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$a = '-'.$s1.'x'.$s2.'';
$b = '-'.$s3.'x'.$s4.'';
$c = '-'.$s5.'x'.$s6.'';
for($d=0; $d <= count($images); $d++){
if(strpos($images[$d],$a)){
echo '$d = '.$d.' '.str_replace($a,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$b)){
echo '$d = '.$d.' '.str_replace($b,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$c)){
echo '$d = '.$d.' '.str_replace($c,'',$images[$d]).'<br>';
}
}
?>
$a = '-'.$s1.'x'.$s2.'';
$b = '-'.$s3.'x'.$s4.'';
$c = '-'.$s5.'x'.$s6.'';
for($d=0; $d <= count($images); $d++){
if(strpos($images[$d],$a)){
echo '$d = '.$d.' '.str_replace($a,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$b)){
echo '$d = '.$d.' '.str_replace($b,'',$images[$d]).'<br>';
}elseif(strpos($images[$d],$c)){
echo '$d = '.$d.' '.str_replace($c,'',$images[$d]).'<br>';
}
}
?>
En het probleem was dus tweeledig waarschijnlijk:
- het erafslopen van de resolutie
- maar het wel onthouden ervan
Gewijzigd op 16/02/2015 16:18:41 door Thomas van den Heuvel
Inmiddels heb ik het werkend en getest :-)
Nu loop ik tegen een kleine issue aan.
In het volgende script zit een loop fout.
De eerste for-loop loopt door de array van images en de loop daarbinnen moet bij iedere loop een pagina nummer verhogen zodat iedere volgende afbeelding op de volgende pagina komt.
Nu wordt een enkele afbeelding twee keer gebruikt op pagina 1 en 2 en daarna wordt pas naar de tweede afbeelding in de array gekeken.
Dit is de output van de echo's
http://www.xxx.nl/uploads/2015/02/test_image3.jpg Het formaat was-360x360
$d = 0
$p = 1
http://www.xxx.nl/uploads/2015/02/test_image3.jpg Het formaat was-360x360
$d = 0
$p = 2
http://www.xxx.nl/uploads/2015/02/test_image2.jpg Het formaat was-360x360
$d = 1
$p = 1
http://www.xxx.nl/uploads/2015/02/test_image2.jpg Het formaat was-360x360
$d = 1
$p = 2
http://www.xxx.nl/uploads/2014/11/test_image.jpg Het formaat was-150x150
$d = 2
$p = 1
http://www.xxx.nl/uploads/2014/11/test_image.jpg Het formaat was-150x150
$d = 2
$p = 2
$d is de loop door de afbeeldingen array en $p is de loop door de pagina's
Code (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
31
32
33
34
35
36
37
38
39
40
41
42
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
31
32
33
34
35
36
37
38
39
40
41
42
<?php
$w = $s3; $w = $pdf->pixelsToUnits($w);
$h = $s4; $h = $pdf->pixelsToUnits($h);
$a = '-'.$s1.'x'.$s2.'';
$b = '-'.$s3.'x'.$s4.'';
$c = '-'.$s5.'x'.$s6.'';
for($d=0; $d <= 2; $d++){
if(strpos($images[$d],$a))
{
for($p=1; $p <= 2; $p++){
echo str_replace($a,'',$images[$d]).' Het formaat was'.$a.'<br>';
echo '$d = '.$d.'<br>';
echo '$p = '.$p.'<br><br>';
$pdf->setPage($p, false);
$pdf->SetXY(0,0);
$pdf->Image(str_replace($a,'',$images[$d]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
}
elseif(strpos($images[$d],$b))
{
for($p=1; $p <= 2; $p++){
echo str_replace($b,'',$images[$d]).' Het formaat was'.$b.'<br>';
echo '$d = '.$d.'<br>';
echo '$p = '.$p.'<br><br>';
$pdf->setPage($p, false);
$pdf->SetXY(0,0);
$pdf->Image(str_replace($a,'',$images[$d]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
}
elseif(strpos($images[$d],$c))
{
for($p=1; $p <= 2; $p++){
echo str_replace($c,'',$images[$d]).' Het formaat was'.$c.'<br>';
echo '$d = '.$d.'<br>';
echo '$p = '.$p.'<br><br>';
$pdf->setPage($p, false);
$pdf->SetXY(0,0);
$pdf->Image(str_replace($a,'',$images[$d]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
}
}
?>
$w = $s3; $w = $pdf->pixelsToUnits($w);
$h = $s4; $h = $pdf->pixelsToUnits($h);
$a = '-'.$s1.'x'.$s2.'';
$b = '-'.$s3.'x'.$s4.'';
$c = '-'.$s5.'x'.$s6.'';
for($d=0; $d <= 2; $d++){
if(strpos($images[$d],$a))
{
for($p=1; $p <= 2; $p++){
echo str_replace($a,'',$images[$d]).' Het formaat was'.$a.'<br>';
echo '$d = '.$d.'<br>';
echo '$p = '.$p.'<br><br>';
$pdf->setPage($p, false);
$pdf->SetXY(0,0);
$pdf->Image(str_replace($a,'',$images[$d]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
}
elseif(strpos($images[$d],$b))
{
for($p=1; $p <= 2; $p++){
echo str_replace($b,'',$images[$d]).' Het formaat was'.$b.'<br>';
echo '$d = '.$d.'<br>';
echo '$p = '.$p.'<br><br>';
$pdf->setPage($p, false);
$pdf->SetXY(0,0);
$pdf->Image(str_replace($a,'',$images[$d]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
}
elseif(strpos($images[$d],$c))
{
for($p=1; $p <= 2; $p++){
echo str_replace($c,'',$images[$d]).' Het formaat was'.$c.'<br>';
echo '$d = '.$d.'<br>';
echo '$p = '.$p.'<br><br>';
$pdf->setPage($p, false);
$pdf->SetXY(0,0);
$pdf->Image(str_replace($a,'',$images[$d]), 22, 40, $w, $h, 'JPG', '', '', true, 300, '', false, false, 0, true, false, true);
}
}
}
?>
Ook is er min of meer een soort van algemene "rule of thumb": als er twee of meerdere keren hetzelfde gebeurt in uitgeschreven code, is er waarschijnlijk ruimte voor vereenvoudiging, bijvoorbeeld in de vorm van een functie (al weet ik niet of dat hier de oplossing is).
Je hebt hierboven beschreven wat er gebeurt, maar mij is niet duidelijk:
- wat hier ongewenst aan is (de originelen komen meerdere keren terug?)
- wat er dan wel moet gebeuren (één afbeelding per pagina?)
Hoe dan ook heb ik besloten hier verder te gaan met de discussie omdat er hier wat fanatieker gereageerd wordt!