Sorunuza göre GD'de yeni gibisiniz, bazı deneyimlerimi paylaşacağım, belki bu biraz konu dışı, ancak sizin gibi GD'ye yeni olan birine yardımcı olacağını düşünüyorum:
Adım 1, dosyayı doğrulayın. $_FILES['image']['tmp_name']
Dosyanın geçerli dosya olup olmadığını kontrol etmek için aşağıdaki işlevi kullanın :
function getContentsFromImage($image) {
if (@is_file($image) == true) {
return file_get_contents($image);
} else {
throw new \Exception('Invalid image');
}
}
$contents = getContentsFromImage($_FILES['image']['tmp_name']);
Adım 2, dosya formatını alın Dosyanın (içerik) dosya formatını kontrol etmek için finfo uzantılı aşağıdaki işlevi deneyin. Neden sadece $_FILES["image"]["type"]
dosya formatını kontrol etmiyorsunuz ? O Çünkü SADECE birisi başlangıçta adlı bir dosyayı yeniden adlandırmak, dosya uzantısı, dosya içeriklerini kontrol World.png için world.jpg , $_FILES["image"]["type"]
png değil jpeg dönecektir böylece $_FILES["image"]["type"]
yanlış sonuç döndürebilir.
function getFormatFromContents($contents) {
$finfo = new \finfo();
$mimetype = $finfo->buffer($contents, FILEINFO_MIME_TYPE);
switch ($mimetype) {
case 'image/jpeg':
return 'jpeg';
break;
case 'image/png':
return 'png';
break;
case 'image/gif':
return 'gif';
break;
default:
throw new \Exception('Unknown or unsupported image format');
}
}
$format = getFormatFromContents($contents);
Adım 3, GD kaynağı alın Daha önce sahip olduğumuz içeriklerden GD kaynağı alın:
function getGDResourceFromContents($contents) {
$resource = @imagecreatefromstring($contents);
if ($resource == false) {
throw new \Exception('Cannot process image');
}
return $resource;
}
$resource = getGDResourceFromContents($contents);
Adım 4, görüntü boyutunu elde edin Şimdi aşağıdaki basit kodla görüntü boyutunu elde edebilirsiniz:
$width = imagesx($resource);
$height = imagesy($resource);
Şimdi, orijinal görüntüden hangi değişkeni aldığımızı görelim.
$contents, $format, $resource, $width, $height
OK, lets move on
Adım 5, yeniden boyutlandırılmış görüntü bağımsız değişkenlerini hesaplayın Bu adım sorunuzla ilgilidir, aşağıdaki işlevin amacı GD işlevi için yeniden boyutlandırma bağımsız değişkenleri elde imagecopyresampled()
etmektir, kod biraz uzun, ancak harika çalışıyor, hatta üç seçeneği var: genişlet, küçült ve doldurun.
streç : çıktı görüntüsünün boyutu, ayarladığınız yeni boyutla aynıdır. Yükseklik / genişlik oranını korumaz.
küçültme : çıktı görüntüsünün boyutu verdiğiniz yeni boyutu aşmaz ve görüntü yükseklik / genişlik oranını korur.
fill : çıktı görüntüsünün boyutu, verdiğiniz yeni boyutla aynı olacaktır, gerekirse görüntüyü kırpıp yeniden boyutlandıracak ve görüntü yükseklik / genişlik oranını koruyacaktır. Bu seçenek, sorunuzda ihtiyacınız olan şeydir.
function getResizeArgs($width, $height, $newwidth, $newheight, $option) {
if ($option === 'stretch') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
$dst_w = $newwidth;
$dst_h = $newheight;
$src_w = $width;
$src_h = $height;
$src_x = 0;
$src_y = 0;
} else if ($option === 'shrink') {
if ($width <= $newwidth && $height <= $newheight) {
return false;
} else if ($width / $height >= $newwidth / $newheight) {
$dst_w = $newwidth;
$dst_h = (int) round(($newwidth * $height) / $width);
} else {
$dst_w = (int) round(($newheight * $width) / $height);
$dst_h = $newheight;
}
$src_x = 0;
$src_y = 0;
$src_w = $width;
$src_h = $height;
} else if ($option === 'fill') {
if ($width === $newwidth && $height === $newheight) {
return false;
}
if ($width / $height >= $newwidth / $newheight) {
$src_w = (int) round(($newwidth * $height) / $newheight);
$src_h = $height;
$src_x = (int) round(($width - $src_w) / 2);
$src_y = 0;
} else {
$src_w = $width;
$src_h = (int) round(($width * $newheight) / $newwidth);
$src_x = 0;
$src_y = (int) round(($height - $src_h) / 2);
}
$dst_w = $newwidth;
$dst_h = $newheight;
}
if ($src_w < 1 || $src_h < 1) {
throw new \Exception('Image width or height is too small');
}
return array(
'dst_x' => 0,
'dst_y' => 0,
'src_x' => $src_x,
'src_y' => $src_y,
'dst_w' => $dst_w,
'dst_h' => $dst_h,
'src_w' => $src_w,
'src_h' => $src_h
);
}
$args = getResizeArgs($width, $height, 150, 170, 'fill');
Adım 6, boyutlandırma görüntü Kullanımı $args
, $width
, $height
, $format
ve aşağıdaki fonksiyonu içine yukarıdan var ve Boyutu değiştirilen görüntünün yeni bir kaynak olsun $ kaynak:
function runResize($width, $height, $format, $resource, $args) {
if ($args === false) {
return;
}
$newimage = imagecreatetruecolor($args['dst_w'], $args['dst_h']);
if ($format === 'png') {
imagealphablending($newimage, false);
imagesavealpha($newimage, true);
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
} else if ($format === 'gif') {
$transparentindex = imagecolorallocatealpha($newimage, 255, 255, 255, 127);
imagefill($newimage, 0, 0, $transparentindex);
imagecolortransparent($newimage, $transparentindex);
}
imagecopyresampled($newimage, $resource, $args['dst_x'], $args['dst_y'], $args['src_x'], $args['src_y'], $args['dst_w'], $args['dst_h'], $args['src_w'], $args['src_h']);
imagedestroy($resource);
return $newimage;
}
$newresource = runResize($width, $height, $format, $resource, $args);
Adım 7, yeni içerikler alın, Yeni GD kaynağından içerik almak için aşağıdaki işlevi kullanın:
function getContentsFromGDResource($resource, $format) {
ob_start();
switch ($format) {
case 'gif':
imagegif($resource);
break;
case 'jpeg':
imagejpeg($resource, NULL, 100);
break;
case 'png':
imagepng($resource, NULL, 9);
}
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
$newcontents = getContentsFromGDResource($newresource, $format);
Adım 8 uzantı edinin, görüntü biçiminden uzantı almak için aşağıdaki işlevi kullanın (not, görüntü biçimi görüntü uzantısına eşit değildir):
function getExtensionFromFormat($format) {
switch ($format) {
case 'gif':
return 'gif';
break;
case 'jpeg':
return 'jpg';
break;
case 'png':
return 'png';
}
}
$extension = getExtensionFromFormat($format);
Adım 9 görüntüyü kaydetme Mike adında bir kullanıcımız varsa, aşağıdakileri yapabilirsiniz, bu php komut dosyasıyla aynı klasöre kaydedilecektir:
$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);
Adım 10 kaynağı yok edin GD kaynağını yok etmeyi unutmayın!
imagedestroy($newresource);
veya tüm kodunuzu bir sınıfa yazabilir ve aşağıdakileri kullanabilirsiniz:
public function __destruct() {
@imagedestroy($this->resource);
}
İPUÇLARI
Kullanıcının yüklediği dosya formatını dönüştürmemenizi öneririm, birçok sorunla karşılaşırsınız.