Image croppen
Ik ben al een eeuwigheid aan 't prusten, maar ik wil een plaatje wat mijn server staat via PHP croppen en dan opnieuw opslaan.
Anders uitgelegd:
Plaatje heeft afmeting 120x90 pixels. Uiteindelijk moet het plaatje 120x66 pixels worden, zonder dat de verhoudingen veranderen. De bovenste 12 en onderste 12 moeten er af, en het midden moet over blijven.
Hoe krijg ik dit voor elkaar?
Groet
Mathijs
Wat heb je al en wat is daarvan het resultaat?
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
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
<?php
public function crop ($dst_w, $dst_h) {
if ($dst_w > $this->w) {
$this->set_err ('<p>Geef een breedte op, kleiner dan ' . $this->w . '</p>');
return false;
}
if ($dst_h > $this->h) {
$this->set_err ('<p>Geef een hoogte op, kleiner dan ' . $this->h . '</p>');
return false;
}
if ($dst_w == $this->w && $dst_h == $this->h) {
$this->set_err ('<p>Er valt niets te croppen, want je hebt <strong>precies</strong> de breedte en de hoogte van het plaatje opgegeven.</p>');
return false;
}
$src = imagecreatefromjpeg ($this->path);
$dst = imagecreatetruecolor ($dst_w, $dst_h);
$src_x = ceil (($this->w - $dst_w) / 2);
$src_y = ceil (($this->h - $dst_h) / 2);
imagecopy ($dst, $src, 0, 0, $src_x, $src_y, $dst_w, $dst_h);
imagejpeg ($dst, $this->path, $this->jpg_quality);
imagedestroy ($src);
imagedestroy ($dst);
// membervariabelen updaten na een resize
$this->w = $dst_w;
$this->h = $dst_h;
$this->set_filesize ();
}
?>
public function crop ($dst_w, $dst_h) {
if ($dst_w > $this->w) {
$this->set_err ('<p>Geef een breedte op, kleiner dan ' . $this->w . '</p>');
return false;
}
if ($dst_h > $this->h) {
$this->set_err ('<p>Geef een hoogte op, kleiner dan ' . $this->h . '</p>');
return false;
}
if ($dst_w == $this->w && $dst_h == $this->h) {
$this->set_err ('<p>Er valt niets te croppen, want je hebt <strong>precies</strong> de breedte en de hoogte van het plaatje opgegeven.</p>');
return false;
}
$src = imagecreatefromjpeg ($this->path);
$dst = imagecreatetruecolor ($dst_w, $dst_h);
$src_x = ceil (($this->w - $dst_w) / 2);
$src_y = ceil (($this->h - $dst_h) / 2);
imagecopy ($dst, $src, 0, 0, $src_x, $src_y, $dst_w, $dst_h);
imagejpeg ($dst, $this->path, $this->jpg_quality);
imagedestroy ($src);
imagedestroy ($dst);
// membervariabelen updaten na een resize
$this->w = $dst_w;
$this->h = $dst_h;
$this->set_filesize ();
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
$img = "thumbs/".$_GET['img'];
// Content type
header('Content-type: image/jpeg');
// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = 120;
$newheight = 66;
// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($img);
// Resize
imagecopyresized($thumb, $source, 0, 33, 0, 33, $newwidth, $newheight, $width, $height);
// Output
imagejpeg($thumb);
?>
$img = "thumbs/".$_GET['img'];
// Content type
header('Content-type: image/jpeg');
// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = 120;
$newheight = 66;
// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($img);
// Resize
imagecopyresized($thumb, $source, 0, 33, 0, 33, $newwidth, $newheight, $width, $height);
// Output
imagejpeg($thumb);
?>
Maar dan krijg ik een keurig vraagtekentje te zien.
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
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
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
<?php
# eigenschappen van de foto achterhalen
list ($Breedte, $Hoogte, $ImageType) = getimagesize ($FotoNaam);
# bepaald de verhouding tussen hoogte en breedte
$ImageRatio = $Breedte / $Hoogte;
# bereken op basis van de ratio de nieuwe hoogte
if ($ImageRatio > 1)
{
$TnBreedte = $ThumbSize;
$TnHoogte = $ThumbSize / $ImageRatio;
}
else
{
$TnHoogte = $ThumbSize;
$TnBreedte = $ThumbSize * $ImageRatio;
}
# Lege thumbnail in het geheuge schrijven
$Thumb = imagecreatetruecolor ($TnBreedte, $TnHoogte);
# Afhankelijk van het type een thumbnail maken
switch ($ImageType)
{
case IMAGETYPE_GIF:
$Source = imagecreatefromgif ($FotoNaam);
break;
case IMAGETYPE_JPEG:
$Source = imagecreatefromjpeg ($FotoNaam);
break;
case IMAGETYPE_PNG:
$Source = imagecreatefrompng ($FotoNaam);
break;
default:
$Source = imagecreatefromgif ($FotoNaam);
break;
}
# De foto verkleinen en kopiëren naar de thumbnail
imagecopyresampled ($Thumb, $Source, 0, 0, 0, 0, $TnBreedte, $TnHoogte, $Breedte, $Hoogte);
# Naam van de thumbnail samenstellen
$Thumbname = $UploadMap . 'thumbnails/' . 'tn_' . $_FILES['foto']['name'];
# tot slot de thumbnail opslaan opnieuw afhankelijk van het type
switch ($ImageType)
{
case IMAGETYPE_GIF:
imagegif ($Thumb, $Thumbname);
break;
case IMAGETYPE_JPEG:
imagejpeg ($Thumb, $Thumbname, 100);
break;
case IMAGETYPE_PNG:
imagepng ($Thumb, $Thumbname);
break;
}
$Bericht[] = 'Uw foto is succesvol opgeslagen in het fotoalbum!';
}
?>
# eigenschappen van de foto achterhalen
list ($Breedte, $Hoogte, $ImageType) = getimagesize ($FotoNaam);
# bepaald de verhouding tussen hoogte en breedte
$ImageRatio = $Breedte / $Hoogte;
# bereken op basis van de ratio de nieuwe hoogte
if ($ImageRatio > 1)
{
$TnBreedte = $ThumbSize;
$TnHoogte = $ThumbSize / $ImageRatio;
}
else
{
$TnHoogte = $ThumbSize;
$TnBreedte = $ThumbSize * $ImageRatio;
}
# Lege thumbnail in het geheuge schrijven
$Thumb = imagecreatetruecolor ($TnBreedte, $TnHoogte);
# Afhankelijk van het type een thumbnail maken
switch ($ImageType)
{
case IMAGETYPE_GIF:
$Source = imagecreatefromgif ($FotoNaam);
break;
case IMAGETYPE_JPEG:
$Source = imagecreatefromjpeg ($FotoNaam);
break;
case IMAGETYPE_PNG:
$Source = imagecreatefrompng ($FotoNaam);
break;
default:
$Source = imagecreatefromgif ($FotoNaam);
break;
}
# De foto verkleinen en kopiëren naar de thumbnail
imagecopyresampled ($Thumb, $Source, 0, 0, 0, 0, $TnBreedte, $TnHoogte, $Breedte, $Hoogte);
# Naam van de thumbnail samenstellen
$Thumbname = $UploadMap . 'thumbnails/' . 'tn_' . $_FILES['foto']['name'];
# tot slot de thumbnail opslaan opnieuw afhankelijk van het type
switch ($ImageType)
{
case IMAGETYPE_GIF:
imagegif ($Thumb, $Thumbname);
break;
case IMAGETYPE_JPEG:
imagejpeg ($Thumb, $Thumbname, 100);
break;
case IMAGETYPE_PNG:
imagepng ($Thumb, $Thumbname);
break;
}
$Bericht[] = 'Uw foto is succesvol opgeslagen in het fotoalbum!';
}
?>
Wel even aanpassen naar je eigen zin natuurlijk
Niels Kieviet op 28/06/2010 10:43:36:
De inhoud van de link, waar ik je naar toe wees....
Wel even aanpassen naar je eigen zin natuurlijk
Wel even aanpassen naar je eigen zin natuurlijk
Het gaat me niet om uploaden, bestand staat al op de server. Het gaat me meer om dat ik de bovenste 12 en onderste 12 pixels er af knip en een nieuwe afbeelding over hou met de middelste 66.
Als ik een standaard resize gebruik, dan kan hij de afbeelding mooi verkleinen maar verdwijnen de pixels niet :-)
Je maakt met PHP een afbeelding van 120*66 pixels, daar leg je de te croppen afbeeling op, precies int het midden (dmv getimagesize etc en dan height en margin etc)en dan opslaan met een formaat van 120*66 pixels? Misschien dat ik je nu op juiste spoor zet waardoor je de code nu zelf in elkaar kunt zetten?
Gewijzigd op 28/06/2010 10:54:32 door Joakim Broden
Sorry, dan heb ik je vraag verkeerd begrepen.
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?
header('Content-type: image/jpeg');
$src_image = "thumbs/".$_GET['img'];
$dst_x = 0;
$dst_y = 0;
$src_x = 0;
$src_y = 12;
$dst_w = 120;
$dst_h = 66;
$src_w = 120;
$src_h = 90;
// Bron krijgen
$dst_image = imagecreatetruecolor($dst_w,$dst_h);
$source = imagecreatefromjpeg($src_image);
imagecopyresized ($dst_image, $source, $dst_x , $dst_y , $src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );
// Output
imagejpeg($dst_image);
?>
header('Content-type: image/jpeg');
$src_image = "thumbs/".$_GET['img'];
$dst_x = 0;
$dst_y = 0;
$src_x = 0;
$src_y = 12;
$dst_w = 120;
$dst_h = 66;
$src_w = 120;
$src_h = 90;
// Bron krijgen
$dst_image = imagecreatetruecolor($dst_w,$dst_h);
$source = imagecreatefromjpeg($src_image);
imagecopyresized ($dst_image, $source, $dst_x , $dst_y , $src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );
// Output
imagejpeg($dst_image);
?>
Dit haalt in ieder geval de bovenste 12 er af.
Maar de onderste 12 laat hij zitten, en dan drukt hij het plaatje iets samen.
Hoe kan ik er voor zorgen dat die er ook af gaan?
Ik gok dat $src_h 12+66 moet zijn.