आप से उद्धरण, ऐसा लगता है कि आप जीडी के लिए नए हैं, मैं कुछ अनुभव साझा करूंगा, शायद यह थोड़ा सा विषय है, लेकिन मुझे लगता है कि यह आपके जैसे जीडी के लिए किसी नए के लिए उपयोगी होगा:
चरण 1, फ़ाइल को मान्य करें। $_FILES['image']['tmp_name']
फ़ाइल मान्य फ़ाइल है या नहीं यह जाँचने के लिए निम्न फ़ंक्शन का उपयोग करें :
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']);
चरण 2, फ़ाइल स्वरूप प्राप्त करें फ़ाइल (सामग्री) के फ़ाइल प्रारूप की जाँच करने के लिए फ़िनिश एक्सटेंशन के साथ निम्न फ़ंक्शन का प्रयास करें। आप कहेंगे कि आप $_FILES["image"]["type"]
फाइल फॉर्मेट को जांचने के लिए क्यों नहीं करते ? क्योंकि यह केवल जांच फाइल एक्सटेंशन सामग्री फाइल नहीं, अगर कोई मूल रूप से कहा जाता है फ़ाइल का नाम बदलने world.png को world.jpg , $_FILES["image"]["type"]
jpeg वापस आ जाएगी png नहीं है, तो $_FILES["image"]["type"]
गलत परिणाम वापस आ सकते हैं।
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);
चरण 3, GD संसाधन प्राप्त करें GD संसाधन हमारे पास पहले से मौजूद सामग्री से प्राप्त करें:
function getGDResourceFromContents($contents) {
$resource = @imagecreatefromstring($contents);
if ($resource == false) {
throw new \Exception('Cannot process image');
}
return $resource;
}
$resource = getGDResourceFromContents($contents);
चरण 4, छवि आयाम प्राप्त करें अब आप निम्न सरल कोड के साथ छवि आयाम प्राप्त कर सकते हैं:
$width = imagesx($resource);
$height = imagesy($resource);
अब, देखते हैं कि मूल छवि से हमें कौन सा चर मिला:
$contents, $format, $resource, $width, $height
OK, lets move on
चरण 5, आकृति परिवर्तन के तर्कों की गणना करें। यह कदम आपके प्रश्न से संबंधित है, निम्न कार्य का उद्देश्य जीडी फ़ंक्शन के लिए पुनरीक्षण तर्क प्राप्त करना है।imagecopyresampled()
, कोड थोड़े लंबा है, लेकिन यह बहुत अच्छा काम करता है, इसमें तीन विकल्प भी हैं: खिंचाव, हटना , और भरें।
खिंचाव : आउटपुट इमेज का आयाम आपके द्वारा निर्धारित नए आयाम के समान है। ऊंचाई / चौड़ाई अनुपात नहीं रखेंगे।
हटना : आउटपुट छवि का आयाम आपके द्वारा दिए गए नए आयाम से अधिक नहीं होगा, और छवि की ऊँचाई / चौड़ाई अनुपात बनाए रखेगा।
भरण : आउटपुट छवि का आयाम आपके द्वारा दिए गए नए आयाम के समान होगा, यहजरूरत पड़ने पर फसल को आकार और आकार देगा, और छवि की ऊंचाई / चौड़ाई अनुपात को बनाए रखेगा। यह विकल्प वही है जो आपको अपने प्रश्न में चाहिए।
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');
चरण 6, आकार छवि का उपयोग करें $args
, $width
, $height
, $format
और $ संसाधन हम निम्नलिखित समारोह में ऊपर से मिला परिवर्तित और छवि के नए संसाधन मिलता है:
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);
चरण 7, नई सामग्री प्राप्त करें, नए GD संसाधन से सामग्री प्राप्त करने के लिए निम्न फ़ंक्शन का उपयोग करें:
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);
चरण 8 को विस्तार मिलता है , छवि प्रारूप से विस्तार पाने के लिए निम्नलिखित फ़ंक्शन का उपयोग करें (ध्यान दें, छवि प्रारूप छवि विस्तार के बराबर नहीं है):
function getExtensionFromFormat($format) {
switch ($format) {
case 'gif':
return 'gif';
break;
case 'jpeg':
return 'jpg';
break;
case 'png':
return 'png';
}
}
$extension = getExtensionFromFormat($format);
चरण 9 सहेजें छवि अगर हमारे पास माइक नाम का कोई उपयोगकर्ता है, तो आप निम्न कार्य कर सकते हैं, यह उसी फ़ोल्डर में बचाएगा, जो इस php स्क्रिप्ट के रूप में है:
$user_name = 'mike';
$filename = $user_name . '.' . $extension;
file_put_contents($filename, $newcontents);
चरण 10 नष्ट संसाधन जीडी संसाधन को नष्ट मत भूलना!
imagedestroy($newresource);
या आप अपने सभी कोड को एक वर्ग में लिख सकते हैं, और बस निम्नलिखित का उपयोग कर सकते हैं:
public function __destruct() {
@imagedestroy($this->resource);
}
टिप्स
मैं अनुशंसा करता हूं कि उपयोगकर्ता द्वारा अपलोड किए जाने वाले फ़ाइल प्रारूप को परिवर्तित न करें, आप कई समस्याओं को पूरा करेंगे।