loop maken voor het inladen van afbeeldingen en het wijzigen van bestandsnaam

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michel van B

Michel van B

16/02/2015 14:33:41
Quote Anchor link
Ik ben momenteel een pagina aan het maken waarbij de content kan worden geëxporteerd naar een PDF
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)
PHP script in nieuw venster Selecteer het PHP script
1
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);  
    }

?>



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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$needles
= array('-'.$s1.'x'.$s2.'','-'.$s3.'x'.$s4.'','-'.$s5.'x'.$s6.'');
    for($i=0; $i <=count($images); $i++){
        foreach($needles as $needle){
        if (strpos($images[$i], $needle));
            echo '<pre>';
            print_r($images);
            echo'</pre>';
        }
    }


?>


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
 
PHP hulp

PHP hulp

25/11/2024 23:17:21
 
Thomas van den Heuvel

Thomas van den Heuvel

16/02/2015 14:50:20
Quote Anchor link
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 :).
 
Michel van B

Michel van B

16/02/2015 15:00:31
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
            }            
        }

?>
Gewijzigd op 16/02/2015 15:21:31 door Michel van B
 
Thomas van den Heuvel

Thomas van den Heuvel

16/02/2015 15:21:53
Quote Anchor link
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?

EDIT: wat je in feite wilt is een soort van patroon-herkenning? Daarvoor zijn reguliere expressies:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo preg_replace('#-(\d+)x(\d+).#', '.', $filename);
?>
Gewijzigd op 16/02/2015 15:35:44 door Thomas van den Heuvel
 
Michel van B

Michel van B

16/02/2015 16:02:04
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
            }            
        }

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

16/02/2015 16:15:56
Quote Anchor link
Lees mijn bovenstaande EDITs :).

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
 
Michel van B

Michel van B

17/02/2015 12:13:04
Quote Anchor link
Thnx voor je EDIT's.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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);
                }
            }        
        }

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

17/02/2015 14:14:07
Quote Anchor link
Bovenstaande code kan met regexps waarschijnlijk een stuk korter.

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?)
 
Obelix Idefix

Obelix Idefix

17/02/2015 18:58:55
 
Michel van B

Michel van B

18/02/2015 12:02:46
Quote Anchor link
Wat is je punt? Dat is een redelijk dood forum geworden en over het algemeen wordt je hier fatsoenlijker te woord gestaan. (zeker als je een beginner bent).

Hoe dan ook heb ik besloten hier verder te gaan met de discussie omdat er hier wat fanatieker gereageerd wordt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.