From you quesion, it seems you are kinda new to GD, I will share some experence of mine,
maybe this is a bit off topic, but I think it will be helpful to someone new to GD like you:
$ _FILES ['Resim'] ['tmp_name'] dosyası geçerli dosya ise Step 1, validate file. denetlemek 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']);
Step 2, get file format dosyası (içindekiler) dosya formatını kontrol etmek finfo uzantısı ile aşağıdaki işlevi deneyin. Sen neden sadece dosya formatını kontrol etmek için $ _FILES ["resim"] ["type"] kullanmayın söyleyebilirim? Birisi aslında world.jpg için World.png adında bir dosyayı yeniden adlandırmak eğer ONLY kontrol dosya uzantısı, dosya içeriklerini Çünkü, $ _FILES ["resim"] ["type"] yani, jpeg png değil dönecektir $ _FILES ["resim"] ["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);
Step.3, Get GD resource daha önce var içeriğinden GD kaynak alın:
function getGDResourceFromContents($contents) {
$resource = @imagecreatefromstring($contents);
if ($resource == false) {
throw new \Exception('Cannot process image');
}
return $resource;
}
$resource = getGDResourceFromContents($contents);
Step 4, get image dimension Şimdi şu basit kod ile görüntü boyut alabilirsiniz:
$width = imagesx($resource);
$height = imagesy($resource);
Now, adlı biz sonra orijinal görüntüden ne var değişken görelim:
$contents, $format, $resource, $width, $height
OK, lets move on
Step 5, calculate resized image arguments Bu adım, sorunun ilgili, aşağıdaki fonksiyon amaçlı), kod tür uzun, ama o inşaat büyük (imagecopyresampled GD işlevi için argümanlar yeniden boyutlandırmak elde etmektir, hatta üç seçenek vardır: , streç küçültmek ve doldurun.
stretch strong>: çıktı Resmin boyutları ayarladığınız yeni boyut olarak aynıdır. Yükseklik / genişlik oranını tutmak olmaz.
shrink strong>: çıktı Resmin boyutları Verdiğiniz yeni bir boyut aşan ve görüntü yükseklik / genişlik oranını tutmak olmaz.
fill : output image's dimension will be the same as new dimension you give, it will crop & resize image if needed, and keep image height/width ratio. This option is what you need in your question.
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');
Step 6, resize image $ args, biz aşağıdaki fonksiyon içine yukarıdan aldım ve boyutlandırılan görüntünün yeni kaynak almak $ genişliğini, yüksekliğini $ $ $ biçimini ve kaynak kullanın:
function runResize($width, $height, $format, $resource, $args) {
if ($args === false) {
return; //if $args equal to false, this means no resize occurs;
}
$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);
Step 7, get new contents, yeni GD kaynak içeriğini 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);
Step 8 get extension, görüntü formatı (not, görüntü formatı görüntü uzantısı eşit değildir) den uzatılmasını almak için aşağıdaki işlevi kullanın:
function getExtensionFromFormat($format) {
switch ($format) {
case 'gif':
return 'gif';
break;
case 'jpeg':
return 'jpg';
break;
case 'png':
return 'png';
}
}
$extension = getExtensionFromFormat($format);
Biz mike adında bir kullanıcı varsa Step 9 save image, aşağıdakileri yapabilirsiniz bu php dosyası olarak aynı klasöre kaydeder:
$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);
Step 10 destroy resource GD kaynak yok unutmayın!
imagedestroy($newresource);
ya da bir sınıfın içine tüm kod yazmak ve sadece aşağıdakileri kullanabilirsiniz:
public function __destruct() {
@imagedestroy($this->resource);
}
TIPS
I recommend not to convert file format that user upload, you will meet many problems, if you really want to, see the following:
Ancak, en kolay yolu GD Kütüphanesi yazılmış benim komut dosyası kullanmak için: GDEnhancer:
PNG, vb, ve dönüştürmek GIF herhangi olmayacaktır zaman dosya biçimi hakkında endişelenmenize gerek yok, ve istediğiniz herhangi bir dosya biçiminde kaydedebilirsiniz, script sizin için otomatik olarak dönüştürür, alfa kanalı verecek sorunlar. Ayrıca GD değil animasyonlu GIF animasyon tutmak.
Burada bir örnek kod:
<?php
use gdenhancer\GDEnhancer;
include_once '../gdenhancer/GDEnhancer.php'; //path of your GDEnhancer.php
$image = new GDEnhancer($tmp_name);
$image->backgroundResize(170, 150, 'fill'); //option 'shrink' or 'fill'
$save = $image->save();
$user_name = 'mike';
$filename = 'avatars/' . $user_name . '.' . $save['extension'];
file_put_contents($filename, $save['contents']);
?>
İşte Demo olduğunu
GD keskin bir öğrenme eğrisi vardır, öğrenmek ve tekrar kodunuzu test etmek gerekir, ayrıca, bir kaç hata onları kendinize düzeltmek zorunda, tho, gibi benzeri animasyon GIF destek vermeyen var :)
Eğer daha fazla sorunuz varsa, sadece ~ terk yorum