เมื่อทำการเรียกรูปภาพของโฮมเพจ บางครั้งจำเป็นต้องได้รูปภาพที่มีขนาดคงที่ เนื่องจากผู้ออกแบบมักจะระบุตำแหน่งรูปภาพของโฮมเพจ หากจะเรียกรูปภาพที่ออกล่าสุดเพราะไม่รู้ว่าอะไร สัดส่วนของรูปภาพที่ลูกค้าจะอัปโหลด ดังนั้น บางครั้งไม่มีทางที่จะกำหนดสัดส่วนของรูปภาพได้ ผู้เขียนเพจมักจะใช้วิธีการกำหนดความสูงและความกว้างขององค์ประกอบ img เพื่อควบคุมรูปภาพไม่ให้ล้น อย่างไรก็ตามหากสัดส่วนของภาพไม่เป็นไปตามสัดส่วนที่กำหนด จะทำให้ภาพผิดรูปหลังจากถูกเรียก ซึ่งส่งผลอย่างมากต่อความสวยงามของหน้า วิธีแก้ไขประการหนึ่งคือปรับขนาดตามสัดส่วนของภาพต้นฉบับ ภาพที่ปรับขนาดจะมีช่องว่างอย่างหลีกเลี่ยงไม่ได้ เติมช่องว่างด้วยสี ด้วยวิธีนี้ แม้ว่ารูปภาพจะไม่เสียรูปแต่ก็จะเกิดปัญหาการบิดเบี้ยวมาก เช่น หากผู้ใช้ส่งรูปภาพที่ผิดเพี้ยนมาก สูงแต่มีความกว้างโดยเฉลี่ย และหากบีบอัดเป็นรูปภาพ 1:1 โดยทั่วไปแล้วจะไม่สามารถมองเห็นรูปภาพได้หลังจากการบีบอัด
วิธีแก้ปัญหาของฉันคือครอบตัดรูปภาพให้มีขนาดคงที่ รูปภาพจะไม่เสียรูป และพื้นที่ว่างจะถูกขยายและเต็ม รูปภาพจะเต็มไปด้วยพื้นที่ว่างเสมอ เพื่อนที่เคยใช้ bcastr ควรรู้ไว้ ช่วยให้มั่นใจได้ว่าการเรียกรูปภาพจะไม่เปลี่ยนรูป สำหรับเฟรมรูปภาพเอาต์พุตที่มีขนาดคงที่ รูปภาพต้นฉบับจะมีสถานการณ์ต่อไปนี้:
1: ความสูงและความกว้างของรูปภาพที่จะส่งออกมีขนาดเล็กกว่าความสูงและความกว้างของรูปภาพต้นฉบับ ซึ่งเขียนเป็นการตัดสิน $new_width<$src_width && $new_height<$src_width
2: ความสูงและความกว้างของรูปภาพที่จะส่งออกมีขนาดใหญ่กว่าความสูงและความกว้างของรูปภาพต้นฉบับ ซึ่งเขียนเป็นการตัดสิน $new_width>$src_width && $new_height>$src_width
3: ไม่รวมสองประเภทที่ 1 และ 2 นั่นคือสถานการณ์ของการซูมเข้าและซูมออกพร้อมกันบวกกับการพิจารณาความเท่าเทียมกัน สำหรับ 1 และ 2 รหัสการประมวลผลของฟังก์ชันจะเหมือนกันทุกประการ จึงสามารถสรุปได้ ลงในคำสั่งการประมวลผลเดียว
เพื่อให้โค้ดการใช้งาน PHP
<?php
-
*คำอธิบาย: ฟังก์ชั่นคือการครอบตัดรูปภาพให้เป็นรูปภาพทุกขนาดโดยไม่ทำให้รูปภาพเสียรูป
* คำอธิบายพารามิเตอร์: ป้อนชื่อไฟล์ของรูปภาพที่จะประมวลผล สร้างชื่อไฟล์บันทึกของรูปภาพใหม่ สร้างความกว้างของรูปภาพใหม่ และสร้างความสูงของรูปภาพใหม่
*เขียนโดย littlechicken
* เวลา 2551-12-61
-
// ได้ภาพทุกขนาด ยืดส่วนที่ขาด ไม่เสียรูป ไม่มีช่องว่าง
ฟังก์ชั่น my_image_resize($src_file, $dst_file, $new_width, $new_height) {
ถ้า($new_width <1 || $new_height <1) {
echo "พารามิเตอร์ความกว้างหรือความสูงผิดพลาด!";
ออก();
-
ถ้า(!file_exists($src_file)) {
echo $src_file . " ไม่มีอยู่ !";
ออก();
-
//ประเภทรูปภาพ
$type=exif_imagetype($src_file);
$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
ถ้า(!in_array($type, $support_type,true)) {
echo "รูปภาพประเภทนี้ไม่รองรับ! รองรับเฉพาะ jpg , gif หรือ png";
ออก();
-
//โหลดรูปภาพ
สวิตช์(ชนิด $) {
กรณี IMAGETYPE_JPEG :
$src_img=imagecreatefromjpeg($src_file);
หยุดพัก;
กรณี IMAGETYPE_PNG :
$src_img=imagecreatefrompng($src_file);
หยุดพัก;
กรณี IMAGETYPE_GIF :
$src_img=imagecreatefromgif($src_file);
หยุดพัก;
ค่าเริ่มต้น:
echo "โหลดรูปภาพผิดพลาด!";
ออก();
-
$w=imagesx($src_img);
$h=imagesy($src_img);
$ratio_w=1.0 * $new_width / $w;
$ratio_h=1.0 * $new_height / $h;
$อัตราส่วน=1.0;
// ความสูงและความกว้างของรูปภาพที่สร้างขึ้นจะเล็กกว่าหรือใหญ่กว่าภาพต้นฉบับ หลักการคือการขยายด้วยอัตราส่วนที่มากและลดขนาดลงด้วยอัตราส่วนที่มาก (อัตราส่วนที่ลดลงจะน้อยลง)
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
ถ้า($อัตราส่วน_w < $อัตราส่วน_h) {
$ratio = $ratio_h ; // กรณีที่ 1 อัตราส่วนความกว้างน้อยกว่าทิศทางความสูง ครอบตัดหรือขยายตามมาตรฐานอัตราส่วนความสูง
}อื่น {
$อัตราส่วน = $อัตราส่วน_w ;
-
// กำหนดรูปภาพชั่วคราวระดับกลางที่มีอัตราส่วนกว้างยาวตรงตามข้อกำหนดของเป้าหมาย
$inter_w=(int)($new_width / $อัตราส่วน);
$inter_h=(int) ($new_height / $อัตราส่วน);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
// สร้างภาพชั่วคราวที่มีความยาวด้านสูงสุดเป็นอัตราส่วน $ratio ของภาพเป้าหมาย
//กำหนดภาพใหม่
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
สวิตช์(ชนิด $) {
กรณี IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // เก็บรูปภาพ
หยุดพัก;
กรณี IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
หยุดพัก;
กรณี IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
หยุดพัก;
ค่าเริ่มต้น:
หยุดพัก;
-
} // สิ้นสุดถ้า 1
// 2 ด้านหนึ่งของภาพเป้าหมายมีขนาดใหญ่กว่าภาพต้นฉบับ และด้านหนึ่งเล็กกว่าภาพต้นฉบับ ขั้นแรกให้ขยายภาพธรรมดาแล้วครอบตัด
// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
อื่น{
$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //รับค่าที่มีอัตราส่วนมากขึ้น
// กำหนดรูปภาพขนาดใหญ่ตรงกลาง ความสูง หรือความกว้างของรูปภาพเท่ากับรูปภาพเป้าหมาย แล้วจึงขยายรูปภาพต้นฉบับ
$inter_w=(int)($w * $อัตราส่วน);
$inter_h=(int) ($h * $อัตราส่วน);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
//ครอบตัดรูปภาพต้นฉบับหลังจากปรับขนาดแล้ว
imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
//กำหนดภาพใหม่
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
สวิตช์(ชนิด $) {
กรณี IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // เก็บรูปภาพ
หยุดพัก;
กรณี IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
หยุดพัก;
กรณี IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
หยุดพัก;
ค่าเริ่มต้น:
หยุดพัก;
-
}//ถ้า3
}// สิ้นสุดฟังก์ชัน
-