php image resize vaste height & width
kleine en grote.
Ik heb een vast formaat namelijk 531 breed en 550 hoog.
Ik wil een plaatje maken, en als van het originele plaatje de hoogte groter is als 531, dan moet hij hem rationeel verkleinen naar maximaal 531. Als dat de breedte ook groter is als 550 hetzelfde verhaal.
Ik wil de ratio houden, maar ze moeten alle2 passen in het vlak en dan ook nog gecentreerd.
Als een plaatje bij 100px hoog is, moet deze niet aan de top vastzitten, maar verticaal aligned worden.
De code hieronder doet het wel aardig, alleen als het originele plaatje een zwarte kleur heeft en ik maak het vaste vlak als een plaatje met een witte achtergrond(255, 255, 255), dan maakt hij het zwart in het plaatje ook lelijk wit. Ziet er niet meer uit.
Weet iemand hoe is dit het best kan bereiken? Het liefst zonder imagick.
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
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
$newWidth = 531;
$newHeight = 550;
$url = 'D:\websites\jakarta-eventsnew\images\events\1\indobuildtech-expo-2020.jpg';
$destdir = 'D:\websites\jakarta-eventsnew\images\events\1\braakwater.jpg';
// download and create gd image
$image = ImageCreateFromString(file_get_contents($url));
$width = ImageSX($image);
$height = ImageSY($image);
$coefficient = $newHeight / $height;
if ( $width > $newWidth) {
$coefficient = $newWidth / $width;
} else
if ($height > $newHeight ) {
$coefficient = $newHeight / $height;
}
// if (($target_width / $width) > $coefficient) { $coefficient = $target_width / $width; }
// create image
$output = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($output, $image, 0, $height * $coefficient, 0, 0, $width * $coefficient, $height * $coefficient, $width, $height);
$bg_color = imagecolorallocate ($output, 255, 255, 255);
imagefill($output, 0, 0, $bg_color);
// save image
imagejpeg($output, $destdir, 100);
$newHeight = 550;
$url = 'D:\websites\jakarta-eventsnew\images\events\1\indobuildtech-expo-2020.jpg';
$destdir = 'D:\websites\jakarta-eventsnew\images\events\1\braakwater.jpg';
// download and create gd image
$image = ImageCreateFromString(file_get_contents($url));
$width = ImageSX($image);
$height = ImageSY($image);
$coefficient = $newHeight / $height;
if ( $width > $newWidth) {
$coefficient = $newWidth / $width;
} else
if ($height > $newHeight ) {
$coefficient = $newHeight / $height;
}
// if (($target_width / $width) > $coefficient) { $coefficient = $target_width / $width; }
// create image
$output = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($output, $image, 0, $height * $coefficient, 0, 0, $width * $coefficient, $height * $coefficient, $width, $height);
$bg_color = imagecolorallocate ($output, 255, 255, 255);
imagefill($output, 0, 0, $bg_color);
// save image
imagejpeg($output, $destdir, 100);
verot.net. Een paar voordelen:
- Scheelt het wiel opnieuw uit te vinden.
- Veel bestaande software-pakketten gebruiken deze ook.
- Heel veel handige methods voor diverse bewerkingen.
- Ruime ondersteuning
Misschien is het een idee om naar te kijken.
Zelf gebruik ik voor resizedoeleinden de uploadclass van - Scheelt het wiel opnieuw uit te vinden.
- Veel bestaande software-pakketten gebruiken deze ook.
- Heel veel handige methods voor diverse bewerkingen.
- Ruime ondersteuning
Misschien is het een idee om naar te kijken.
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
43
44
45
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
<?php
$f='mijn volledig pad naar de foto';
$mtc = mime_content_type($f);
$ok = false;
switch ($mtc) {
case 'image/jpeg':
header("Content-Type: image/jpeg");
$im = imagecreatefromjpeg($f);
$ok = true;
break;
case 'image/png':
header("Content-Type: image/png");
$im = @imagecreatefrompng($f);
$ok = true;
break;
case 'image/gif':
header("Content-Type: image/gif");
$im = imagecreatefromgif($f);
$ok = true;
break;
case 'image/bmp':
header("Content-Type: image/bmp");
$im = imagecreatefrombmp($f);
$ok = true;
break;
case 'image/x-ms-bmp':
header("Content-Type: image/x-ms-bmp");
$im = imagecreatefrombmp($f);
$ok = true;
break;
}
list($width, $height) = getimagesize($f);
$bgc=imagecolorallocate($im, 255, 255, 255);
$tc=imagecolorallocate($im, 0, 0, 0);
$newheight = 50;
$procent = $width / $height;
$newwidth=$newheight*$procent;
$thumb =imagecreatetruecolor($newwidth, $newheight);
imageCopyResized($thumb, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagepng($thumb);
imagedestroy($im);
imagedestroy($thumb);
return $thumb;
?>
$f='mijn volledig pad naar de foto';
$mtc = mime_content_type($f);
$ok = false;
switch ($mtc) {
case 'image/jpeg':
header("Content-Type: image/jpeg");
$im = imagecreatefromjpeg($f);
$ok = true;
break;
case 'image/png':
header("Content-Type: image/png");
$im = @imagecreatefrompng($f);
$ok = true;
break;
case 'image/gif':
header("Content-Type: image/gif");
$im = imagecreatefromgif($f);
$ok = true;
break;
case 'image/bmp':
header("Content-Type: image/bmp");
$im = imagecreatefrombmp($f);
$ok = true;
break;
case 'image/x-ms-bmp':
header("Content-Type: image/x-ms-bmp");
$im = imagecreatefrombmp($f);
$ok = true;
break;
}
list($width, $height) = getimagesize($f);
$bgc=imagecolorallocate($im, 255, 255, 255);
$tc=imagecolorallocate($im, 0, 0, 0);
$newheight = 50;
$procent = $width / $height;
$newwidth=$newheight*$procent;
$thumb =imagecreatetruecolor($newwidth, $newheight);
imageCopyResized($thumb, $im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagepng($thumb);
imagedestroy($im);
imagedestroy($thumb);
return $thumb;
?>
wel natuurlijk $newheight aanpassen aan jouw eisen
Eventueel verder controleren of alle types ondersteunt worden welke je aanvaard.
Jan
Dit werkt perfect, bedankt!
Simpelweg omdat iets werkt, maakt het nog niet juist.
Gewijzigd op 10/04/2020 23:05:39 door Thomas van den Heuvel
Ik verwees naar de uploadclass van verot.net wat werkte.
Thomas van den Heuvel op 10/04/2020 23:05:21:
en de code kan waarschijnlijk wel wat korter, en er kan ook wel wat meer foutafhandeling in.
twee maal juist :)
Thomas van den Heuvel op 10/04/2020 23:05:21:
Die $ok doet trouwens niets?
In de volledige code wel. vergeten opkuisen. sorry