[PHP] Image Resize (resizen zonder uitrekken van afbeelding)

Pagina: 1
Acties:
  • 3.365 views

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Hay tweakers!

Ik ben bezig met een functie om een afbeelding te resizen, ik weet dat het heel makkelijk kan. Maar op die manier worden afbeeldingen te veel uitgerekt en ziet het er niet uit!

Daarvoor heb ik het volgende gemaakt http://dev.kevinvdburgt.nl/TEST/example_imageresize/?w=1000&h=200 die werk voor zover goed, maar dit is een afbeelding die meer breed is dan hoog. Maar hoe zit het als de afbeelding meer hoog is dan breed? Dan moet de volgorde om gedraaid worden? of is er een andere techniek om dit te doen?

Ik hoop niet dat deze vraag als onnozel word gezien, wat naar mijn mening nogal snel gebeurd op tweakers. Maar om dit op deze manier te krijgen ben ik al een hele dag mee bezig. Ook veel ge-googled maar alleen dingen gevonden die de afbeelding laat uitrekken.

Acties:
  • 0 Henk 'm!

Anoniem: 26306

Dan moet je óf de hoogte, óf de breedte opgeven (niet allebei). Deel de originele breedte door de nieuwe breedte. Je hebt nu de schaalfactor. Vermenigvuldig de hoogte met die schaalfactor en de verhoudingen blijven gelijk.
Standaard wiskunde uit de brugklas.

[ Voor 3% gewijzigd door Anoniem: 26306 op 08-08-2010 22:12 ]


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Anoniem: 26306 schreef op zondag 08 augustus 2010 @ 22:11:
Dan moet je óf de hoogte, óf de breedte opgeven (niet allebei). Deel de originele breedte door de nieuwe breedte. Je hebt nu de schaalfactor. Vermenigvuldig de hoogte met die schaalfactor en de verhoudingen blijven gelijk.
Standaard wiskunde uit de brugklas.
Ik geef de hoogte en de breedte allebei op, omdat bijv. het niet breder mag zijn dan 800px en niet hoger dan 600px.

Acties:
  • 0 Henk 'm!

  • Rob
  • Registratie: Februari 2000
  • Niet online

Rob

Anoniem: 369184 schreef op zondag 08 augustus 2010 @ 22:18:
[...]

Ik geef de hoogte en de breedte allebei op, omdat bijv. het niet breder mag zijn dan 800px en niet hoger dan 600px.
Dus dan kijk je eerst wat de hoogte wordt als je de breedte 800 maakt, als dat meer dan 600 is dan maak je de hoogte 600 en bereken je de nieuwe breedte.

In the beginning the Internet was a bunch of smart users with dumb terminals. Now...


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Anoniem: 369184 schreef op zondag 08 augustus 2010 @ 22:18:
[...]

Ik geef de hoogte en de breedte allebei op, omdat bijv. het niet breder mag zijn dan 800px en niet hoger dan 600px.
Heb je de post die je citeert überhaupt gelezen? ;)

Het gaat om de schalingsfactor. Als je de verhoudingen gelijk wil houden dan kun je niet zomaar een hoogte en breedte meegeven, je zal moeten berekenen welke dimensie (x of y) het eerste buiten je bounding box gaat, en die als max nemen. De andere dimensie schaal je gewoon naar verhouding mee met een simpel rekensommetje.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 08-06 19:49

TheNephilim

Wtfuzzle

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if ($current_height > $current_width AND $current_height > $max_height)
{
  $new_width  = floor($current_width * ($max_height / $current_height));
  $new_height = $max_height;
}
elseif ($current_width > $max_width)
{
  $new_width  = $max_width;
  $new_height = floor($current_height * ($max_width / $current_width));
}
else
{
  $new_width  = $current_width;
  $new_height = $current_height;
}


Zoiets moet het dan worden...

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
in feite zijn er nog 2 mogelijkheden, jij geeft op rekt deze image op naar 800x600. Dan kun je uitrekken zodat ie bijv. 800x680 wordt en jij 80 pixels weg moet snijden, of je zorgt dat de image dus binnen de 800x600 maximaal rekt en deze dus bijv. 760x600 wordt, optioneel kun je dan dus de extra ruimte opvullen met een background-kleur zodat ie weer 800x600 wordt. Leuke dingen om te maken :)

edit: we hebben er zelfs een kleine ambilight-achtige functie voor die de background automatisch kleurt naar de image :+

[ Voor 13% gewijzigd door Cartman! op 09-08-2010 10:52 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Ik zou vooral geen "and" gebruiken waar je een boolean and ("&&") bedoelt. Ten eerste vanwege de andere betekenis en te tweede vanwege de lagere precedence. ;)

Heel lief dat je gewoon een kant en klare functie geeft trouwens, maar daar leert een topicstarter natuurlijk ook niet zoveel van. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Cartman: What about the ambilight function?? :o

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 04-06 17:49
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    $outputwidth = 640;
    $outputheight = 480;
    $originalwidth = imagesx($photo);
    $originalheight = imagesy($photo);
    if($originalwidth > $originalheight){
        $resamplefactor = $originalwidth / $wantedwidth;
        $outputwidth = $originalwidth / $resamplefactor;
        $outputheight = $originalheight / $resamplefactor;
    }else{
        $resamplefactor = $originalheight / $wantedheight;
        $outputheight = $originalheight / $resamplefactor;
        $outputwidth = $originalwidth / $resamplefactor;
    }
    $photo_res = imagecreatetruecolor($outputwidth, $outputheight);
    imagecopyresampled($photo_res, $photo, 0, 0, 0, 0, $outputwidth, $outputheight, $originalwidth, $originalheight);


Vast niet de meest optimale methode, maar zoiets wordt er bij ons gebruikt. :P

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Noxious schreef op maandag 09 augustus 2010 @ 11:51:
Vast niet de meest optimale methode, maar zoiets wordt er bij ons gebruikt. :P
Inderdaad niet optimaal, want hij is fout. Een plaatje van bijvoorbeeld 640 x 600 wordt nu niet geresized en past dan niet meer binnen de 640 x 480...

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Omdat ik die functies en het geklooi met berekeningen en uitzonderingen dus zat ben heb ik gewoon een class gemaakt met verschillende functies "cropToSize" waarin ik als argumenten meegeef hoe groot ie max. mag worden (cropToSize(640, 480) dus, wat er teveel is snijdt ie weg) waarna ie zelf uitrekend wat voor nieuwe image ie ervan moet maken. Daar maak je dan meerdere combinaties voor: bijv. resizeByPercentage, resizeToWidth (resized tot de breedte die je opgeeft met behoud van ratio), resizeToHeight (zelfde maar dan met hoogte), resizeToMaximum (rekt tot maximaal de aangegeven hoogte/breedte) zodat je elke mogelijke resize/crop kunt afvangen.

Daaraan toegevoegd nog een berg filters/fx/watermerk-dingen en zo kun je voortaan in een paar regels elke image omzetten naar hoe je em wilt. Kost je even wat uitzoektijd maar daarna hoef je er niet meer naar om te kijken.

M'n eigen class gooi ik niet op het web maar ik geloof dat er in PEAR ook een soortgelijk iets zit (die ik niet relaxt vond werken en ik miste wat features) maar dan ben je vast een eind op weg.

Zoiets dus in code:
PHP:
1
2
3
$image = new Image_Manipulation('/home/tweakers/image.jpg');
$image->cropToSize(640, 480);
$image->save('/home/tweakers/image.png');


Bij de input zoekt ie zelf uit wat voor formaat t is (ondervangt ook png die .jpg heeft als extensie) en de default output is altijd png (kun je nog aanpassen, net als de kwaliteit).

[ Voor 13% gewijzigd door Cartman! op 09-08-2010 12:23 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Eh... leuk verkooppraatje voor iets wat je niet wilt delen...

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 19:42

Reptile209

- gers -

Guillome schreef op maandag 09 augustus 2010 @ 11:03:
Cartman: What about the ambilight function?? :o
Zou toch niet al te moeilijk moeten zijn. Pak een gemiddelde kleur van de buitenrand van de image (evt alleen links of rechts of boven of onder) en zet die als background. Misschien nog wat fancy gewogen middelen van een strook van x pixels breed aan de buitenrand.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 08-06 19:49

TheNephilim

Wtfuzzle

... verkeerd gelezen

[ Voor 94% gewijzigd door TheNephilim op 09-08-2010 12:40 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

NMe schreef op maandag 09 augustus 2010 @ 10:53:
Ik zou vooral geen "and" gebruiken waar je een boolean and ("&&") bedoelt. Ten eerste vanwege de andere betekenis en te tweede vanwege de lagere precedence. ;)
Zowel "&&" als "and" zijn een logische AND en doen dus precies hetzelfde (afgezien van hun precedence). Jij verwart de logische AND met de bitwise AND, die je doet met "&".

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:11

Creepy

Tactical Espionage Splatterer

Guillome schreef op maandag 09 augustus 2010 @ 12:36:
Eh... leuk verkooppraatje voor iets wat je niet wilt delen...
We zitten dan ook hier in PRG, waar we zelf dingen maken. Zo moeilijk is het nu ook weer niet om zelf in elkaar te draaien ;) Met wat logisch nadenken en niet al te moeilijk rekenwerk moet je een heel eind kunnen komen.

[ Voor 13% gewijzigd door Creepy op 09-08-2010 12:49 ]

"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


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

.oisyn schreef op maandag 09 augustus 2010 @ 12:42:
[...]

Zowel "&&" als "and" zijn een logische AND en doen dus precies hetzelfde (afgezien van hun precedence). Jij verwart de logische AND met de bitwise AND, die je doet met "&".
Nope. "And" is iets anders dan "&&". Zelfde geldt voor "or" en "||". Zie ook http://php.net/manual/en/language.operators.logical.php :)

edit:
Ah, dat bedoel jij dus ook. Ik verwoordde het wat krom in mijn vorige post. :)

[ Voor 9% gewijzigd door NMe op 09-08-2010 12:58 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Creepy schreef op maandag 09 augustus 2010 @ 12:48:
[...]

We zitten dan ook hier in PRG, waar we zelf dingen maken. Zo moeilijk is het nu ook weer niet om zelf in elkaar te draaien ;) Met wat logisch nadenken en niet al te moeilijk rekenwerk moet je een heel eind kunnen komen.
Precies, wellicht heb ik anderen nu op een idee gebracht om voor zichzelf iets te maken waar je weer van kunt leren ;)
Reptile209 schreef op maandag 09 augustus 2010 @ 12:39:
[...]

Zou toch niet al te moeilijk moeten zijn. Pak een gemiddelde kleur van de buitenrand van de image (evt alleen links of rechts of boven of onder) en zet die als background. Misschien nog wat fancy gewogen middelen van een strook van x pixels breed aan de buitenrand.
Daar komt het inderdaad ongeveer op neer ja, absoluut geen rocket science...

[ Voor 33% gewijzigd door Cartman! op 09-08-2010 13:05 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Creepy schreef op maandag 09 augustus 2010 @ 12:48:
[...]

We zitten dan ook hier in PRG, waar we zelf dingen maken. Zo moeilijk is het nu ook weer niet om zelf in elkaar te draaien ;) Met wat logisch nadenken en niet al te moeilijk rekenwerk moet je een heel eind kunnen komen.
Het is niet voor mij, ik heb zelf ook zoiets gemaakt. Maar op die manier verkopend praten vind dan raar

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Verkopend? Passievol! :*

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

raar! :P

[ Voor 23% gewijzigd door Guillome op 09-08-2010 13:07 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Nu online

MueR

Admin Tweakers Discord

is niet lief

Guillome schreef op maandag 09 augustus 2010 @ 13:04:
Het is niet voor mij, ik heb zelf ook zoiets gemaakt. Maar op die manier verkopend praten vind dan raar
Omdat ik liever lui dan moe ben winkel ik in reactie hierop wat in Creepy's post;
Creepy schreef op maandag 09 augustus 2010 @ 12:48:
We zitten dan ook hier in PRG, waar we zelf dingen maken allemaal wat vreemd zijn

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

:o

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

NMe schreef op maandag 09 augustus 2010 @ 12:57:
[...]

Nope. "And" is iets anders dan "&&". Zelfde geldt voor "or" en "||". Zie ook http://php.net/manual/en/language.operators.logical.php :)

edit:
Ah, dat bedoel jij dus ook. Ik verwoordde het wat krom in mijn vorige post. :)
Tenzij je het nu ook krom verwoordt bedoel ik dat dus niet. "And" is helemaal niet iets anders dan "&&". Alleen de precedence is anders, maar het doet niet iets anders.

.edit: ok goed als je dat ziet als dat het iets anders is omdat het geen perfecte synoniem is dan kan ik daar wel in meegaan, maar ik reageerde vooral op het feit dat je zei dat "and" een andere betekenis had dan "&&" (naast het feit dat de precedence anders is).

[ Voor 20% gewijzigd door .oisyn op 09-08-2010 14:03 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Nou het is me gelukt hoor ;)
Ben vannacht tot 3uur door gegaan, 8uur wakker, verder progge. En nu is het af :D

Dit is het dus uiteindelijk geworden:
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
43
44
45
46
47
48
49
50
51
52
53
    //Function CalculateMaxSizeImage
    function CalculateMaxSizeImage($orginal_w, $orginal_h, $max_w, $max_h){
        $return[2]=TRUE;
        if($orginal_w < $max_w && $orginal_h < $max_h){ $w = $orginal_w; $h = $orginal_h; $return[2]=FALSE; }
        if($orginal_w > $max_w){    $h = ($orginal_h * $max_w) / $orginal_w;    $h = round($h, 0);      $w = $max_w;    }
        if($orginal_h > $max_h){    $w = ($orginal_w * $max_h) / $orginal_h;    $w = round($w, 0);      $h = $max_h;    }
        $return[0] = round($w,0);
        $return[1] = round($h,0);
        return $return;
    }
    //Function ResizeImage
    function ResizeImage($file, $a, $b, $c, $d, $q=100){
        if(!file_exists($file)) return FALSE;
        
        $image = getimagesize($file);
        $mime = image_type_to_mime_type($image[2]);     
        switch($mime){
            case 'image/pjpeg':     
            case 'image/jpeg':
            case 'image/jpg':
                    $file2 = imagecreatefromjpeg($file);
                    $img = imagecreatetruecolor($c, $d);
                    imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
                    unlink($file);  
                    @imagejpeg($img, $file, $q);
                    break;
            case 'image/png':
            case 'image/x-png':
                    $file2 = imagecreatefrompng($file);
                    $img = imagecreatetruecolor($c, $d);
                    imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
                    unlink($file);
                    @imagepng($img, $file, $q);
                    break;
            case 'image/gif':
                    $file2 = imagecreatefromgif($file);
                    $img = imagecreatetruecolor($c, $d);
                    imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
                    unlink($file);
                    @imagegif($img, $file);
                    break;
            case 'image/bmp':
                    $file2 = imagecreatefromwbmp($file);
                    $img = imagecreatetruecolor($c, $d);
                    imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
                    unlink($file);
                    @image2wbmp($img, $file);
                    break;
            default:
                    return FALSE;
                    break;
        }
    }

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Good job :)
Zet alleen voor regel 3 even:
$return = Array()

Je laat alleen niet al je code zien hier. Vanwaar de return[2] = true?

En die @ weghalen. Als je save fout gaat, wil je dat ook weten. Of maak er een mooie melding van.
En waarom de unlink?
En waarom veel code dubbel?

$img = imagecreatetruecolor($c, $d);
imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
unlink($file);


Oftewel: show alle code

edit:
En volgens http://php.net/manual/en/...age-type-to-mime-type.php geeft image_type_to_mime_type een int terug, en geen string

[ Voor 52% gewijzigd door Guillome op 09-08-2010 15:21 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Nu online

Janoz

Moderator Devschuur®

!litemod

Nog los van de grote hoeveelheid duplicate code in het tweede deel zou ik je toch aanraden om je eerste functie eens goed te (unit) testen. Kijk bijvoorbeeld eens naar het resultaat van CalculateMaxSizeImage(400,200,100,100)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

WBMP en BMP zijn totaal verschillende formaten, en image/bmp kun je dus niet openen met imagecreatefromwbmp. ;) WBMP heeft image/vnd.wap.wbmp als mime-type en wordt eigenlijk maar heel weinig gebruikt. ;) Dat kun je ook allemaal in de manual nalezen: http://nl2.php.net/imagecreatefromwbmp

Daarnaast: errors suppressen heeft natuurlijk weinig zin als je vervolgens niet afvangt of er iets mis is gegaan. ;) En je commentaar is ook redelijk overbodig. Regel 1 bij het schrijven van zinnig commentaar: don't state the obvious. Ik zou eerder zinnig commentaar verwachten over de werking van het resizen.

[ Voor 7% gewijzigd door NMe op 09-08-2010 15:23 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 19:42

Reptile209

- gers -

Guillome schreef op maandag 09 augustus 2010 @ 15:14:
[...]
En waarom veel code dubbel?

$img = imagecreatetruecolor($c, $d);
imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
unlink($file);
Die code is weliswaar dubbel, maar daarna zit er steeds weer een file-type afhankelijk vervolg achter. Dus zo makkelijk is het ook weer niet om dat weg te werken. Het kàn wel, maar of het er leesbaarder van wordt...'

Ik vind het gebruik van $a t/m $d veel storender. Gebruik aub wat meer omschrijvende variabelenamen! Over een week zit je al weer te puzzelen wat $d ook al weer was, zeker omdat je ze niet in een hele logische volgorde gebruikt.
Oftewel: show alle code
[...]
Waarom? Dit is volgens mij wel een mooie snippet die voldoet aan "toon de relevante code". Er zou zelfs nog wel het een en ander weg kunnen ;).

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
THX =]
Guillome schreef op maandag 09 augustus 2010 @ 15:14:
Zet alleen voor regel 3 even:
$return = Array()
Done!
Guillome schreef op maandag 09 augustus 2010 @ 15:14:

Je laat alleen niet al je code zien hier. Vanwaar de return\[2] = true?
Als plaatje is ge-resized dan TRUE anders FALSE.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
                $image = getimagesize('../'.$node);
                $x=$image[0];
                $y=$image[1];
                $res = CalculateMaxSizeImage($x, $y, $new_x, $new_y);
                //$res = CalculateMaxSizeImage(500, 500, 200, 100);
                if($res[2]==TRUE){
                    $nx = $res[0];
                    $ny = $res[1];
                    ResizeImage('../'.$node, $x, $y, $nx, $ny);
                } else {
                    $nx = $x;
                    $ny = $y;
                }
Guillome schreef op maandag 09 augustus 2010 @ 15:14:
En die @ weghalen. Als je save fout gaat, wil je dat ook weten. Of maak er een mooie melding van.
Hmm, inderdaad. Ik maak er wel ff return waarde's van. return FALSE;
Omdat de oude afbeelding weg moet.
Guillome schreef op maandag 09 augustus 2010 @ 15:14:
En waarom veel code dubbel?

$img = imagecreatetruecolor($c, $d);
imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
unlink($file);
Hoe kan ik het anders doen? Dan moet ik 2x een switch gebruiken.
Guillome schreef op maandag 09 augustus 2010 @ 15:14:
edit:
En volgens http://php.net/manual/en/...age-type-to-mime-type.php geeft image_type_to_mime_type een int terug, en geen string
Nope, volgens mij wel een string ;)
Janoz schreef op maandag 09 augustus 2010 @ 15:14:
Nog los van de grote hoeveelheid duplicate code in het tweede deel zou ik je toch aanraden om je eerste functie eens goed te (unit) testen. Kijk bijvoorbeeld eens naar het resultaat van CalculateMaxSizeImage(400,200,100,100)
Hmmm. okee even doen zo.
NMe schreef op maandag 09 augustus 2010 @ 15:23:
WBMP en BMP zijn totaal verschillende formaten, en image/bmp kun je dus niet openen met imagecreatefromwbmp. ;) WBMP heeft image/vnd.wap.wbmp als mime-type en wordt eigenlijk maar heel weinig gebruikt. ;) Dat kun je ook allemaal in de manual nalezen: http://nl2.php.net/imagecreatefromwbmp

Daarnaast: errors suppressen heeft natuurlijk weinig zin als je vervolgens niet afvangt of er iets mis is gegaan. ;) En je commentaar is ook redelijk overbodig. Regel 1 bij het schrijven van zinnig commentaar: don't state the obvious. Ik zou eerder zinnig commentaar verwachten over de werking van het resizen.
Oh oeps :$ hoe kan ik de BMP dan wel verwerken?

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Oh ja geeft wel een string terug :P

Ik heb dit gedaan voor je dubbele code vraag:

imageCreateFromAll("plaatje.png");

Met daarin (ingekort)

$s = file_get_contents($img);
return imageCreateFromString($s);

En zoiets zou je ook kunnen doen met imageSaveAll()

Als je met een class werkt zoals hierboven al genoemd is, werkt het nog veel makkelijker. Dan kan je bij het openen in de class opslaan welk type het is, en bij de save functie weer gebruiken.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 04-06 17:49
eamelink schreef op maandag 09 augustus 2010 @ 12:01:
[...]


Inderdaad niet optimaal, want hij is fout. Een plaatje van bijvoorbeeld 640 x 600 wordt nu niet geresized en past dan niet meer binnen de 640 x 480...
Verbaast me niets, deze code is al 5 jaar oud ofzo en toen geschreven door iemand die Frontpage onder Windows 98 gebruikte als z'n primaire editor (should i say more?).

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Anoniem: 369184 schreef op maandag 09 augustus 2010 @ 15:47:
[...]

Oh oeps :$ hoe kan ik de BMP dan wel verwerken?
Niet met GD in elk geval. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

BMP? Op internet?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Uploaden als BMP, resizen en opslaan als JPEG? Why not?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Dan moet ie `m wel opslaan als jpeg, nu slaat ie m op als (w)bmp

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • kaesve
  • Registratie: Maart 2009
  • Laatst online: 16-05 03:04
om duplicate code te vermijden zou je het zo kunnen oplossen, al ben ik zelf niet zo heel fan van de variabele functienamen..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$mime_map = array('image/pjpeg' => 'jpeg', 
                  'image/jpeg' => 'jpeg', 
                  'image/pjpg' => 'jpeg',
                  'image/x-png' => 'png',
                  'image/png' => 'png',
                  'image/gif' => 'gif');

$type = $mime_map[$mime];

//get type-specific functionnames
$fn_create = 'imagecreatefrom' . $type;
$fn_save = 'image' . $type;

//
$file2 = $fn_create($file); 
$img = imagecreatetruecolor($c, $d); 
imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b); 
unlink($file);
$fn_save($img, $file, $q); //$q also added in case of imagegif, but it won't affect anything


hmm. ik denk dat ik guillome's manier mooier vind, maar ik wilde het toch even kwijt :]

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Daarom moet je de input- en outputformaten ook los van elkaar zien, dan kun je alle ondersteunde formaten altijd bijv. opslaan als png, vind ik persoonlijk erg handig. Dan kun je daarna in je app ervanuit gaan dat iets altijd PNG is bijv.

Overigens vraag ik me af hoe betrouwbaar de mime-type is die je terugkrijgt....

offtopic:
Die break; bij je default heb je niet nodig als je daarvoor een return doet ;)

[ Voor 3% gewijzigd door Cartman! op 09-08-2010 16:39 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Cartman! schreef op maandag 09 augustus 2010 @ 16:39:
offtopic:
Die break; bij je default heb je niet nodig als je daarvoor een return doet ;)
offtopic:
Toch zou ik hem gewoon netjes opnemen, gewoon om consequent te zijn. Wat als je gaat refactoren en besluit dat die return weg mag en vergeet er een break bij te zetten? Is in dit geval nog steeds niet erg omdat het de laatste case is, maar in een andere situatie zou het best vervelende bugs op kunnen leveren. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
offtopic:
Ik vind het dan overbodige code, als je bij een refactor het vergeet dan ben je best onhandig bezig. Als je die return weghaalt dan moet je al direct zien dat er geen break; staat. Zal wel een kwestie van smaak zijn...

Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Guillome schreef op maandag 09 augustus 2010 @ 15:55:
Oh ja geeft wel een string terug :P

Ik heb dit gedaan voor je dubbele code vraag:

imageCreateFromAll("plaatje.png");

Met daarin (ingekort)

$s = file_get_contents($img);
return imageCreateFromString($s);

En zoiets zou je ook kunnen doen met imageSaveAll()

Als je met een class werkt zoals hierboven al genoemd is, werkt het nog veel makkelijker. Dan kan je bij het openen in de class opslaan welk type het is, en bij de save functie weer gebruiken.
Je bedoeld zo iets?
PHP:
1
2
3
4
5
6
7
8
9
    function ResizeImage($file, $a, $b, $c, $d, $q=100){
        if(!file_exists($file)) return FALSE;
        
        $file2 = file_get_contents($file);
        $img = imagecreatetruecolor($c, $d);
        imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
        unlink($file);  
        imagejpeg($img, $file, $q); 
       }


Dan krijg ik deze fout :S

Warning: imagecopyresampled() expects parameter 2 to be resource, string given in F:\HTDOCS\dev.kevinvdburgt.nl\holland_int\core\gallery_func.php on line 137

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Wat denk je dat er nu in $file2 zit? Dat is inderdaad een string en geen gd resource, daarvoor moet je niet file_get_contents gebruiken maar de bijhorende imagepng-functie (bij png dus). Die error klopt dus gewoon volledig.

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
De fout staat? PHP verwacht een resource (aka een file in jouw geval) en je stopt er een string in, immers de inhoud van de file!

Oh en als ik dan toch bezig ben, leer jezelf gelijk even aan om je variabelen normale namen te geven ipv $file1, $a,$b etc.. Is wel zo leesbaar over een maandje of twee ;)

[ Voor 40% gewijzigd door kwaakvaak_v2 op 09-08-2010 17:13 ]

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Oke, weer even terug bij af. Ik heb de functie opnieuw geschreven, en dit keer wat netter en duidelijker. Ik hoop dat deze ook wat beter werkt.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        function CalculateResizeImage($source_w, $source_h, $max_w, $max_h){
            if($source_w <= $max_w && $source_h <=  $max_h){
                $new_w = $source_w;
                $new_h = $source_w; 
            } else {
                $source_ratio = $source_w / $source_h;
                if(($max_w/$max_h) > $source_ratio){
                    $new_w = $max_h * $source_ratio;
                    $new_h = $max_h;
                } else {
                    $new_h = $max_w / $source_ratio;
                    $new_w = $max_w;
                }
            }
            $return = array();
            $return['w'] = $new_w;
            $return['h'] = $new_h;
            return $return;
        }


EDIT:
Even een floor(); gebruikt, anders krijg je nog eens rare getallen. Kommagetallen als pixels? dus 33,3333 pixels :P??

Code is nu:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        /**
         *  Scale the image to max_w and max_h
        **/
        function CalculateResizeImage($source_w, $source_h, $max_w, $max_h){
            if($source_w <= $max_w && $source_h <=  $max_h){
                $new_w = $source_w;
                $new_h = $source_w; 
            } else {
                $source_ratio = $source_w / $source_h;
                if(($max_w/$max_h) > $source_ratio){
                    $new_w = $max_h * $source_ratio;
                    $new_h = $max_h;
                } else {
                    $new_h = $max_w / $source_ratio;
                    $new_w = $max_w;
                }
            }
            $return = array();
            $return['w'] = floor($new_w);
            $return['h'] = floor($new_h);
            return $return;
        }

[ Voor 36% gewijzigd door Anoniem: 369184 op 09-08-2010 20:08 ]


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Ik wil niet lullig doen, maar na de floor() call klopt je schaalfactor niet maar. Voorbeeld:


Stel je script komt uit op een width van 300,81 pixels en een height van 902,43
Je hebt dan een verhouding tussen lengte en breedte van 902,43 / 300,81 = 3
Na floor() wordt de width 300 en de height 902 en dus de verhouding 3,0066667
Lijkt een klein verschil, maar ik durf te wedden dat je het kan zien.

Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
L0calh0st schreef op maandag 09 augustus 2010 @ 20:32:
Ik wil niet lullig doen, maar na de floor() call klopt je schaalfactor niet maar. Voorbeeld:


Stel je script komt uit op een width van 300,81 pixels en een height van 902,43
Je hebt dan een verhouding tussen lengte en breedte van 902,43 / 300,81 = 3
Na floor() wordt de width 300 en de height 902 en dus de verhouding 3,0066667
Lijkt een klein verschil, maar ik durf te wedden dat je het kan zien.
Ik kan dus beter round(); gebruiken?

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 08-06 19:49

TheNephilim

Wtfuzzle

Anoniem: 369184 schreef op maandag 09 augustus 2010 @ 21:02:
[...]

Ik kan dus beter round(); gebruiken?
Nou dat zou alleen beter zijn in het geval van (bijv) 3.9 dat hij dan 3 maakt ipv 4. Dus round is misschien beter ja

Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Bernardo schreef op maandag 09 augustus 2010 @ 21:40:
[...]


Nou dat zou alleen beter zijn in het geval van (bijv) 3.9 dat hij dan 3 maakt ipv 4. Dus round is misschien beter ja
Oke, dat heb ik aangespast. (Werkt inderdaad beter).

Ondertussen heb ik ook gelijk een OpenImage functie gemaakt.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        function OpenImage($file){
            if(!file_exists($file)) return FALSE;   
            if(!is_file($file)) return FALSE;
            $mime = getimagesize($file);
            if(!isset($mime[2])) return FALSE;
            
            if(in_array(image_type_to_mime_type($mime[2]), $this->_mimes)){
                $content = file_get_contents($file);
                $content = imagecreatefromstring($content);
                return $content;                
            } else {
                return FALSE;
            }
        }


en de array $_mimes
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
        public $_mimes = array(
            'image/bmp',
            'image/cis-code',
            'image/gif',
            'image/ief',
            'image/jpeg',
            'image/pipeg',
            'image/jpg',
            'image/x-png',
            'image/png',
            'image/svg+xml',
            'image/tiff',
            'image/x-cmu-raster',
            'image/x-cmx',
            'x-icon',
            'x-portable-anymap',
            'x-portable-bitmap',
            'x-portable-graymap',
            'x-portable-graymap',
            'x-portable-pixmap',
            'x-rgb',
            'x-xbitmap',
            'x-xpixmap',
            'x-xwindowdump'
        );

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Bernardo schreef op maandag 09 augustus 2010 @ 21:40:
[...]

Nou dat zou alleen beter zijn in het geval van (bijv) 3.9 dat hij dan 3 maakt ipv 4. Dus round is misschien beter ja
En jij denkt dat die ene pixel zoveel verschil maakt? :) Met round loop je ook nog eens het risico dat je één pixel buiten je bounding box komt en het plaatje daarmee te groot wordt. Slechts één pixel, maar daar kan je layout ook op breken natuurlijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
NMe schreef op maandag 09 augustus 2010 @ 22:59:
[...]

En jij denkt dat die ene pixel zoveel verschil maakt? :) Met round loop je ook nog eens het risico dat je één pixel buiten je bounding box komt en het plaatje daarmee te groot wordt. Slechts één pixel, maar daar kan je layout ook op breken natuurlijk.
haha, het is een plaatje dat in een lightbox komt, dus 1px zal je niet snel zien denk ik :P?

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Anoniem: 369184 schreef op maandag 09 augustus 2010 @ 16:48:
[...]


Je bedoeld zo iets?
PHP:
1
2
3
4
5
6
7
8
9
    function ResizeImage($file, $a, $b, $c, $d, $q=100){
        if(!file_exists($file)) return FALSE;
        
        $file2 = file_get_contents($file);
        $img = imagecreatetruecolor($c, $d);
        imagecopyresampled($img, $file2, 0, 0, 0, 0, $c, $d, $a, $b);
        unlink($file);  
        imagejpeg($img, $file, $q); 
       }


Dan krijg ik deze fout :S

Warning: imagecopyresampled() expects parameter 2 to be resource, string given in F:\HTDOCS\dev.kevinvdburgt.nl\holland_int\core\gallery_func.php on line 137
Nee goed lezen, ik bedoel imageCreateFromString

Edit: Ik zie dat je het al werkend hebt.
1 ding nog:
if(!file_exists($file)) return FALSE;
if(!is_file($file)) return FALSE;
Alleen de 2e regel is genoeg.

[ Voor 10% gewijzigd door Guillome op 10-08-2010 01:08 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Anoniem: 369184 schreef op maandag 09 augustus 2010 @ 23:40:
[...]

haha, het is een plaatje dat in een lightbox komt, dus 1px zal je niet snel zien denk ik :P?
Mja, maar dat geldt dus ook de andere kant op. :P Ik kan me in elk geval niet voorstellen dat je het verschil ziet tussen een plaatje van 641x480 en eentje van 640x480. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Plus dat je die bounding box niet voor niks opgeeft, als je functie dan toch images groter dan die box eruit kan spugen dan is ie in mijn ogen waardeloos. Lekker floor() pakken dus :)

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:00

Matis

Rubber Rocket

Ik heb vroegah ook mijn hoofd gebroken over het resizen van afbeeldingen, portrait of landscape met een maximale langste zijde, en dan ook nog zorgen dat de breedte van de afbeeldingen ongeveer gelijk blijft (aspectratio's etc).
En toen ontdekte ik de grote magische wereld van Imagemagick O+ Natuurlijk is zelf knutselen leuk, maar als je je wilt richten op performance, dan kun je daar niet tegen op :)

Leuk om te zien hoe je script in de loop van die topic geevalueerd is tot een generiek systeem. Persoonlijk zou ik proberen om je afbeelding altijd als png naar de browser te sturen, vooral omdat je je dan niet druk hoeft te maken over transparantie / alpha-chanel, althans, die wijsheid heb ik mezelf aangeleerd :p

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Matis schreef op dinsdag 10 augustus 2010 @ 09:31:
Leuk om te zien hoe je script in de loop van die topic geevalueerd is tot een generiek systeem. Persoonlijk zou ik proberen om je afbeelding altijd als png naar de browser te sturen, vooral omdat je je dan niet druk hoeft te maken over transparantie / alpha-chanel, althans, die wijsheid heb ik mezelf aangeleerd :p
Daar sluit ik me bij aan, PNG ondersteunt alles wat je wilt eigenlijk. Ook is het lekker om na 1 keer userinput er daarna vanuit te kunnen gaan dat je image een png is zodat je niet de hele tijd extensies/mimes hoeft te checken.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Altijd als PNG? Leuk voor foto's die je als lossy JPG geupload krijgt. Kost je een bak extra ruimte en dataverkeer, zonder reden. Lekker in het oorspronkelijke formaat houden. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 08-06 19:49

TheNephilim

Wtfuzzle

NMe schreef op dinsdag 10 augustus 2010 @ 01:08:
[...]

Mja, maar dat geldt dus ook de andere kant op. :P Ik kan me in elk geval niet voorstellen dat je het verschil ziet tussen een plaatje van 641x480 en eentje van 640x480. :+
Neuj, dat niet, maar het ging me erom dat het inderdaad wel scheelt. Nou zal het niet uitmaken in 99% van de situaties, maar even voor de volledigheid :p

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe schreef op dinsdag 10 augustus 2010 @ 09:40:
Altijd als PNG? Leuk voor foto's die je als lossy JPG geupload krijgt. Kost je een bak extra ruimte en dataverkeer, zonder reden. Lekker in het oorspronkelijke formaat houden. :)
Hangt vast af van hoe je het daarna gebruikt dan. Ik resize de inkomende foto altijd altijd naar een vast formaat voor bijv. avatar oid als png. Het origineel bewaar ik wel nog mochten we die ooit nodig hebben voor meer dingen.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:00

Matis

Rubber Rocket

Cartman! schreef op dinsdag 10 augustus 2010 @ 09:54:
Hangt vast af van hoe je het daarna gebruikt dan. Ik resize de inkomende foto altijd altijd naar een vast formaat voor bijv. avatar oid als png. Het origineel bewaar ik wel nog mochten we die ooit nodig hebben voor meer dingen.
Ja, dat bedoel ik ook. Ik sla het originele bestand op, met natuurlijk de originele indeling. Echter als ik aan de afbeelding ga knutselen, dan sla ik hem op als PNG.
Daarnaast is PNG speciaal ontwikkeld / bedacht voor het gebruik in/over het internet en is het nog eens licentie-vrij te gebruiken.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anoniem: 369184 schreef op maandag 09 augustus 2010 @ 20:03:
Even een floor(); gebruikt, anders krijg je nog eens rare getallen. Kommagetallen als pixels? dus 33,3333 pixels :P??
Even afgezien van het feit dat je hier idd beter floor() gebruikt is dat helemaal geen raar concept, hoor. Je GPU kan daar ook prima mee overweg.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Matis schreef op dinsdag 10 augustus 2010 @ 10:33:
[...]

Ja, dat bedoel ik ook. Ik sla het originele bestand op, met natuurlijk de originele indeling. Echter als ik aan de afbeelding ga knutselen, dan sla ik hem op als PNG.
Daarnaast is PNG speciaal ontwikkeld / bedacht voor het gebruik in/over het internet en is het nog eens licentie-vrij te gebruiken.
Succes met het opslaan van (bijvoorbeeld) een 3-megapixel-versie van een 10-megapixel-foto in PNG. PNG is lossless en derhalve moet je goed opletten waar je het wel en niet voor kan gebruiken. Voor foto's op het internet is het bijna altijd ongeschikt... Daarom gebruik ik voor geresizede varianten bijna altijd gewoon het originele type.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Aha, dus eigenlijk weer terug zetten naar orginele formaat?

het is me gelukt om BMP in te lezen in PHP :D Mooi artiekel op het internet gevonden (kan nergens meer vinden :( )

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
        function ConvertBMP2GD($src, $dest=false){
            if(!($src_f = fopen($src,  'rb'))) return FALSE;
            if(!($dest_f= fopen($dest, 'wb'))) return FALSE;
            $header = unpack("vtype/Vsize/v2reserved/Voffset", fread($src_f,14));
            $info = unpack("Vsize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vncolor/Vimportant",
            fread($src_f, 40));
            extract($info);
            extract($header);
            if($type != 0x4D42) return FALSE; // signature BM
            $palette_size = $offset - 54;
            $ncolor = $palette_size / 4;
            $gd_header = "";    
            
            // true-color vs. palette
            $gd_header .= ($palette_size == 0) ? "\xFF\xFE" : "\xFF\xFF";
            $gd_header .= pack("n2", $width, $height);
            $gd_header .= ($palette_size == 0) ? "\x01" : "\x00";
            if($palette_size){
                $gd_header .= pack("n", $ncolor);
            }
            // no transparency
            $gd_header .= "\xFF\xFF\xFF\xFF";
            fwrite($dest_f, $gd_header);        
            if($palette_size) {
                $palette = fread($src_f, $palette_size);
                $gd_palette = "";
                $j = 0;
                while($j < $palette_size) {
                    $b = $palette{$j++};
                    $g = $palette{$j++};
                    $r = $palette{$j++};
                    $a = $palette{$j++};
                    $gd_palette .= "$r$g$b$a";
                }
                $gd_palette .= str_repeat("\x00\x00\x00\x00", 256 - $ncolor);
                fwrite($dest_f, $gd_palette);
            }                   
            $scan_line_size = (($bits * $width) + 7) >> 3;
            $scan_line_align = ($scan_line_size & 0x03) ? 4 - ($scan_line_size & 0x03) : 0;
            for($i = 0, $l = $height - 1; $i < $height; $i++, $l--) {
                // BMP stores scan lines starting from bottom
                fseek($src_f, $offset + (($scan_line_size + $scan_line_align) * $l));
                $scan_line = fread($src_f, $scan_line_size);
                if($bits == 24) {
                    $gd_scan_line = "";
                    $j = 0;
                    while($j < $scan_line_size) {
                        $b = $scan_line{$j++};
                        $g = $scan_line{$j++};
                        $r = $scan_line{$j++};
                        $gd_scan_line .= "\x00$r$g$b";
                    }
                } else if($bits == 8) {
                    $gd_scan_line = $scan_line;
                } else if($bits == 4) {
                    $gd_scan_line = "";
                    $j = 0;
                    while($j < $scan_line_size) {
                        $byte = ord($scan_line{$j++});
                        $p1 = chr($byte >> 4);
                        $p2 = chr($byte & 0x0F);
                        $gd_scan_line .= "$p1$p2";
                    }
                    $gd_scan_line = substr($gd_scan_line, 0, $width);
                }else if($bits == 1) {
                    $gd_scan_line = "";
                    $j = 0;
                    while($j < $scan_line_size) {
                        $byte = ord($scan_line{$j++});
                        $p1 = chr((int) (($byte & 0x80) != 0));
                        $p2 = chr((int) (($byte & 0x40) != 0));
                        $p3 = chr((int) (($byte & 0x20) != 0));
                        $p4 = chr((int) (($byte & 0x10) != 0));
                        $p5 = chr((int) (($byte & 0x08) != 0));
                        $p6 = chr((int) (($byte & 0x04) != 0));
                        $p7 = chr((int) (($byte & 0x02) != 0));
                        $p8 = chr((int) (($byte & 0x01) != 0));
                        $gd_scan_line .= "$p1$p2$p3$p4$p5$p6$p7$p8";
                    }
                    $gd_scan_line = substr($gd_scan_line, 0, $width);
                }

                fwrite($dest_f, $gd_scan_line);
            }
            fclose($src_f);
            fclose($dest_f);
            return true;
        }
        
        function imagecreatefrombmp($filename){
            $tmp_name = tempnam(".", "GD");
            if($this->ConvertBMP2GD($filename, $tmp_name)){
                $img = imagecreatefromgd($tmp_name);
                unlink($tmp_name);
                return $img;    
            }
            return FALSE;
        }

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 20:44

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wazig, waarom zou je 'm eerst wegschrijven als .gd file ipv er gewoon direct een image van te maken.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

...waarbij wederom imagecreatefromstring in plaats van imagecreatefromgd je vriend is. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
ik gebruik meestal gewoon http://phpthumb.sourceforge.net/ doet ook een nette scale met crop from center bijvoorbeeld, en degrade netjes naar standaard functies als er geen imagemagick aanwezig is :)

En ja er zit ook een php lib bij die een BMP inleest en verwerkt.

[ Voor 14% gewijzigd door kwaakvaak_v2 op 10-08-2010 13:12 ]

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
kwaakvaak_v2 schreef op dinsdag 10 augustus 2010 @ 13:12:
ik gebruik meestal gewoon http://phpthumb.sourceforge.net/ doet ook een nette scale met crop from center bijvoorbeeld, en degrade netjes naar standaard functies als er geen imagemagick aanwezig is :)

En ja er zit ook een php lib bij die een BMP inleest en verwerkt.
Ik zelf vind het juist leuker om zelf alles te programeren.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Hele goede instelling, daar leer je heel veel van natuurlijk :)
Maar ook leer je er heel veel van om te kijken hoe anderen programmeren :)
Ik doe meestal een combi, kijken hoe de toppers het doen, en het zelf implementeren.
Alleen grote, of complexe dingen gebruik ik van anderen, zoals bijv. jQuery.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
wat Guillome zegt :) Soms is het niet slecht om even te spieken hoe andere dingen doen ipv ploeteren en zelf een ovaal wiel uitvinden.

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Guillome schreef op dinsdag 10 augustus 2010 @ 13:37:
Hele goede instelling, daar leer je heel veel van natuurlijk :)
Maar ook leer je er heel veel van om te kijken hoe anderen programmeren :)
Ik doe meestal een combi, kijken hoe de toppers het doen, en het zelf implementeren.
Alleen grote, of complexe dingen gebruik ik van anderen, zoals bijv. jQuery.
Er zijn wel dingne die ik gebruik ja, o.a. jQuery maar dat is wel heel complex en ben helaas geen JS expert.

Wat nu ook een vervelend probleem is. Ik wil nu een functie maken die een thumb van een afbeelding maakt. Maar het wil niet echt lukken. De functie moet zo werken:

function ThumbImage($image, $thumb_w, $thumb_h)

Die functie moet dan dit doen
Eerst de afbeelding moet eerst $thumb_w en $thumb_h zijn, (net als imageResize van mijn functie) maar dan dat die formaat er wel inpast (beetje scheve uitleg, maar hopelijk snappen jullie het) Vervolgens moet hij de randen afsnijden. Maar ik krijg alleen maar hele rare resultaten. En niet wat ik graag zou willen.

Ik moet zodirect even werken tot 8uur (korte werktijd :P) en dan ga ik weer verder.. Ik houd jullie op de hoogte :)

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:00

Matis

Rubber Rocket

Wat een van deze functies doen?
http://www.php.net/manual/en/function.imagecopy.php
http://www.php.net/manual/en/function.imagecopyresampled.php
en/of
http://www.php.net/manual/en/function.imagecopyresized.php

Als je je dst_x, dst_y, src_x en src_y op 0 houdt, dan cropt hij vanaf (geloof ik) linksboven de breedte en hoogte welke jij opgeeft.

[ Voor 24% gewijzigd door Matis op 10-08-2010 18:46 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Wat helpt: Teken het uit op papier

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Guillome schreef op dinsdag 10 augustus 2010 @ 18:57:
Wat helpt: Teken het uit op papier
Hmm heb het getekent, maar hij blijft moeilijk, en krijg het niet helemaal voor elkaar.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Wat gaat er mis dan? Je had je code toch al goed?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 00:38

NMe

Quia Ego Sic Dico.

Met "hijdoetutnie" kunnen we hier inderdaad niet zoveel. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
NMe schreef op dinsdag 10 augustus 2010 @ 21:54:
Met "hijdoetutnie" kunnen we hier inderdaad niet zoveel. ;)
Haha, sorry :$

Nee het probleem is, ik krijg mijn functie maar niet goed.

Ik wil een afbeelding thumben, heb ook al op google gesearched maar daar vind ik alleen dingen die je plaatje thumben, maar dan is alles uitgerekt, en ziet het er niet goed uit.

Ik wil eerst dat het plaatje naar een iets grotere schaal dan de thumb word gemaakt. en dan de randen er af snijd. Maar ik weet niet hoe ik dat moet uit rekenen.

Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Anoniem: 369184 schreef op dinsdag 10 augustus 2010 @ 22:07:
[...]
Ik wil een afbeelding thumben, heb ook al op google gesearched maar daar vind ik alleen dingen die je plaatje thumben, maar dan is alles uitgerekt, en ziet het er niet goed uit.
Huh, dat vat ik niet. Wat is het verschil tussen een afbeelding thumben en een plaatje thumben?
Anoniem: 369184 schreef op dinsdag 10 augustus 2010 @ 22:07:
[...]
Ik wil eerst dat het plaatje naar een iets grotere schaal dan de thumb word gemaakt. en dan de randen er af snijd. Maar ik weet niet hoe ik dat moet uit rekenen.
Dat is dubbel werk, dat kan ook anders. Je weet neem ik aan hoe groot je het plaatje en hoe groot je de rand wilt hebben.

Dan doe je het volgende:

Bereken de schaalfactor tussen nieuwe grootte en oude grootte (voor zowel breedte als hoogte).
De rand die je van de thumb af wil hebben reken je dan uit door de bekende breedte van de rand te delen door de schaalfactor (ook weer breedte en hoogte)
De rand trekje van de te maken thumb af en dan maak je het plaatje, dat scheelt 1x plaatjes maken.

In een voorbeeld:

Oorspronkelijke afbeelding: 100x200 px
Grootte van de thumb + rand: 40x30 px
Grootte van de rand: 5x5 px

100/40 = 2,50
200/30 = 6,67

5/2,50 = 2,00
5/6,67 = 0,75

40 - 2 = 38,00
30 - 0,75 = 29,25

Dus je moet de afbeelding resizen naar 38x29 px

Maar wat ik niet snap is waarom je die rand eraf wilt slopen ;)

Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
L0calh0st schreef op dinsdag 10 augustus 2010 @ 22:25:
[...]

Huh, dat vat ik niet. Wat is het verschil tussen een afbeelding thumben en een plaatje thumben?
:$ ehm ik ook niet? waarschijnlijk wat wartaal :P??
L0calh0st schreef op dinsdag 10 augustus 2010 @ 22:25:
[...]

Huh, dat vat ik niet. Wat is het verschil tussen een afbeelding thumben en een plaatje thumben?


[...]


Dat is dubbel werk, dat kan ook anders. Je weet neem ik aan hoe groot je het plaatje en hoe groot je de rand wilt hebben.

Dan doe je het volgende:

Bereken de schaalfactor tussen nieuwe grootte en oude grootte (voor zowel breedte als hoogte).
De rand die je van de thumb af wil hebben reken je dan uit door de bekende breedte van de rand te delen door de schaalfactor (ook weer breedte en hoogte)
De rand trekje van de te maken thumb af en dan maak je het plaatje, dat scheelt 1x plaatjes maken.

In een voorbeeld:

Oorspronkelijke afbeelding: 100x200 px
Grootte van de thumb + rand: 40x30 px
Grootte van de rand: 5x5 px

100/40 = 2,50
200/30 = 6,67

5/2,50 = 2,00
5/6,67 = 0,75

40 - 2 = 38,00
30 - 0,75 = 29,25

Dus je moet de afbeelding resizen naar 38x29 px

Maar wat ik niet snap is waarom je die rand eraf wilt slopen ;)
de rand er af slopen omdat anders de afbeelding vaag word, bijv:

Oorspronkele afbeelding: 200 x 100
Thumb formaat: 50 x 50

dan word de hoogte de helft, maar de breedte word 2x de helft dus de afbeelding ziet er langwerpig uit. Als je snapt wat ik bedoel.


@ l0calh0st, je handschrift is Op zoek naar freelance web development projecten (PHP/MySQL/JavaScript/HTML/CSS) DM me

moet het niet zijn PM me?:$

[ Voor 4% gewijzigd door Anoniem: 369184 op 10-08-2010 22:42 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

tuurlijk niet, 200 * 100 is breed
50 * 50, dan wordt ie 50*25 pix, is nog altijd breed

@edit:
PM = personal message
DM = direct message

Is het zelfde, alleen andere naam :)

[ Voor 35% gewijzigd door Guillome op 10-08-2010 22:47 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
@ l0calh0st, je handschrift is Op zoek naar freelance web development projecten (PHP/MySQL/JavaScript/HTML/CSS) DM me

moet het niet zijn PM me?
@edit:
PM = personal message
DM = direct message

Is het zelfde, alleen andere naam
;)

Acties:
  • 0 Henk 'm!

Anoniem: 369184

Topicstarter
Guillome schreef op dinsdag 10 augustus 2010 @ 22:42:
tuurlijk niet, 200 * 100 is breed
50 * 50, dan wordt ie 50*25 pix, is nog altijd breed
Hmm, ik hoop dat het zo wat duidelijker word wat ik bedoel.

Afbeeldingslocatie: http://server.kevinvdburgt.nl/data/images/example_001.png
aha :P

[ Voor 16% gewijzigd door Anoniem: 369184 op 10-08-2010 22:57 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

dan moet je croppen, jeetje je mag wel een beetje tutorials doen voordat je alles vraagt hoor.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • bindsa
  • Registratie: Juli 2009
  • Niet online
Anoniem: 369184 schreef op dinsdag 10 augustus 2010 @ 22:56:
[...]

Hmm, ik hoop dat het zo wat duidelijker word wat ik bedoel.


[...]

aha :P
Dat is toch niet zo moeilijk?
Je hebt bijv. een afbeelding van 300 x 600 px.
Afbeelding resizen naar gewenste grootte (bijv. 200px hoog).
Je schaalfactor wordt dan 300/200 = 1,5.
Je nieuwe breedte wordt dan 600/1,5 = 400.
Dat is 400 - 200 = 200px te breed.
Dus 200/2 = 100 px aan elke kant er af slopen.

Of interpreteer ik je plaatje verkeerd?

Edit: Zoals Guillome al zegt zijn dit niet meer dan standaard bewerkingen met plaatjes, hierbij geldt: Google is je vriend.

Bijvoorbeeld deze: http://lmgtfy.com/?q=image+copy+resampling

De eerste link is zelfs een PHP link, wat wil je nog meer? :)

[ Voor 16% gewijzigd door bindsa op 10-08-2010 23:05 ]


Acties:
  • 0 Henk 'm!

  • dB90
  • Registratie: Oktober 2004
  • Laatst online: 04-03-2024
Zoals kwaakvaak_v2 al zei: phpthumb.

code:
1
phpThumb.php?src=mijnplaatje.jpg&w=50&h=50&zc=1


Klaar.

Webberry Webdevelopment


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:00

Matis

Rubber Rocket

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:11

Creepy

Tactical Espionage Splatterer

Edit: Zoals Guillome al zegt zijn dit niet meer dan standaard bewerkingen met plaatjes, hierbij geldt: Google is je vriend.
Dat dus. Ga nu eerst eens echt zelf aan de slag. Het is echt geen rocket science. Mocht je er dan echt nog niet uitkomen dan kan je een nieuw topic openen maar geef dan in elk geval aan wat je nu zelf al precies hebt geprobeerd. Je hebt nu het 1 en ander voorgekauwen gekregen, dus het lijkt me dat je er wel uit moet komen nu. Maar eigenlijk is het de bedoeling dat je zelf eerst dingen gaat lopen uitzoeken en proberen voordat je hier een oplossing komt vragen.

"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

Pagina: 1

Dit topic is gesloten.