[PHP]imagecopyresized - by andere ratio een zwart strookje

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
Hallo...

Ik ben vandaag een beetje aan de gang gegaan met GD en PHP om een groot aantal images te resizen.
Dit script controleert ook wat de langste zijde is(dus breedte , hoogte of hoogte , breedte).
Zodat de images juist worden geresized.(niet dat we van die uitgetrokken images krijgen als de hoogte groter is dan de breedte)

Het gedeelte van het script dat die check doet , ziet er zo uit
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
//if not ,  create the thumbnail file
                                            $sizes = getimagesize($imageName);
                                            $width = $sizes[0];
                                            $heigth = $sizes[1];
                                            $newWidth = $this->imageWidth;
                                            $newHeigth = $this->imageHeight;
                                            //create the filename for the new thumbnail file
                                            $fileName = $imageStart."_1_thumb.jpg";
                                    
                                            //check which ratio(width/heigth) the image has
                                            //to resize in good format
                                            if($width >= $heigth)
                                            {   //create the thumbnail
                                                $image_p = imagecreatetruecolor($newWidth, $newHeigth);
                                                $image_n = imagecreatefromjpeg($imageName);
                                                imagecopyresized($image_p, $image_n, 0, 0, 0, 0, $newWidth, $newHeigth, $width, $heigth);
                                                imagejpeg($image_p, $site."/".$fileName, 50);
        
                                            }
                                            elseif($heigth >= $width)
                                            {   //create the thumbnail
                                                $image_p = imagecreatetruecolor($newHeigth,$newWidth);
                                                $image_n = imagecreatefromjpeg($imageName);
                                                imagecopyresized($image_p, $image_n, 0, 0, 0, 0,  $newHeigth,$newWidth, $heigth,$width);
                                                imagejpeg($image_p, $site."/".$fileName, 50);


Dit werkt allemaal perfect bij een image die breder is , dan dat hij hoog is.
Dus eigenlijk de normale resolutie.

Maar als een image hoger is , dan dat hij breed is , dan krijg ik aan de rechterkant van het geresized plaatje , en zwart strookje.
Wel staat de image er helemaal op , maar hij vult de rest op met een zwart strookje

Ter verduidelijking zal ik een voorbeeldje van een geresizede afbeelding hier posten
Afbeeldingslocatie: http://img392.imageshack.us/my.php?image=39011thumbbj7.jpg

Mijn vraag is dus....
Waar gaat dit fout?
Want ik heb voor de ELSE functie , dus netjes alleen de variablen omgewisseld.
Of gaat er soms iets in mijn(niet al te grote) wiskundige bol iets mis? , want zo houdt ik mij toch aan de goede verhoudingen?

Hopelijk kunnen jullie mij weer iets opweg helpen

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

  • OkkE
  • Registratie: Oktober 2000
  • Laatst online: 04-09 08:16

OkkE

CSS influencer :+

Hoe kom je aan de waardes voor de $newWidth en $newHeight? Waar ik zo als eerste aan denk, is dat er iets niet goed gaat met 't uitrekenen van de verhouding. Als er een nieuwe afbeelding gemaakt wordt door PHP/GD dan is deze standaard zwart, wanneer daar een verkleinde afbeelding over geplaatst wordt, die niet helemaal even groot is, zal je dus een stukje zwart zien.

“The best way to get the right answer on the Internet is not to ask a question, it's to post the wrong answer.”
QA Engineer walks into a bar. Orders a beer. Orders 0 beers. Orders 999999999 beers. Orders a lizard. Orders -1 beers.


Acties:
  • 0 Henk 'm!

  • degroot
  • Registratie: December 2003
  • Niet online
OkkE schreef op woensdag 21 februari 2007 @ 16:06:
Hoe kom je aan de waardes voor de $newWidth en $newHeight? .
Die heb ik boven aan in de class gedefineerd staan.

PHP:
1
2
3
4
class Thumbnail
{
    var $imageWidth = 100;
    var $imageHeight = 65;


En dat word in de functie zo opgepakt
PHP:
1
2
$newWidth = $this->imageWidth;
$newHeigth = $this->imageHeight;

Maar dit laatste stukje code staat ook in mijn startpost.

www.degroot-it.nl


Acties:
  • 0 Henk 'm!

Verwijderd

de achtergrondkleur van je aangepaste afbeelding moet je eerst vullen met een kleur, anders wordt deze automatisch zwart.

PHP:
1
2
$achtergrond = imagecolorallocate($image_p, 255,255,255);
imagefill($image_p, 0,0 , $achtergrond);


Daarnaast kun je beter gebruik maken van deze functie voor een betere kwaliteit.

PHP:
1
imagecopyresampled();

[ Voor 4% gewijzigd door Verwijderd op 21-02-2007 16:15 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
degroot schreef op woensdag 21 februari 2007 @ 16:01:
Want ik heb voor de ELSE functie , dus netjes alleen de variablen omgewisseld.
Je kunt de variabelen niet zomaar omwisselen. Waarom zou een plaatje dat eerst minder breed is dan hoog na resizen plotseling minder hoog zijn dan breed?
Je kunt altijd één van de twee dimensies vastkiezen (hoogte of breedte), en aan de hand daarvan de andere dimensie met verhoudingen berekenen.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Waarom draai je width en height overal om? Ik kan me voorstellen dat je je plaatje draait, maar ik denk dat het niet de bedoeling is om de orginele hoogte en breedte ook te verwisselen.

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!

  • degroot
  • Registratie: December 2003
  • Niet online
Verwijderd schreef op woensdag 21 februari 2007 @ 16:14:
Daarnaast kun je beter gebruik maken van deze functie voor een betere kwaliteit.
PHP:
1
imagecopyresampled();
Het probleem met deze functie is dat de groote van de afbeeldingen bijna hetzelfde blijft(Afbeeldingen zijn rond de 10KB)
Ook als ik de parameter voor de kwaliteit verander , blijft de afbeelding bijna even groot.

Gebruik ik
PHP:
1
imagecopyresized();

En ik verander mijn parameters , dan krijg ik netjes afbeeldingen van 2 of 3 KB

Die verkleint ze dus ook echt in de grootte.

Klopt dat wat ik zeg? of zou
PHP:
1
imagecopyresampled();

hetzelfde moeten doen?

Het probleem met de zwarte strook is nu opgelost.
Janos had gelijk , ik had een variable verkeerd omgewisseld by imagecopyresized()

Bedankt voor jullie toelichtingen



Wel zou ik graag nog even een toelichting willen op mijn vraag hierboven m.b.t imagecopyresized/imagecopyresampled

[ Voor 110% gewijzigd door degroot op 21-02-2007 16:39 ]

www.degroot-it.nl

Pagina: 1