Saat membuat gambar panggilan halaman beranda, terkadang diperlukan gambar dengan ukuran tetap, karena posisi gambar halaman beranda biasanya ditentukan oleh desainer. Jika ingin memanggil gambar rilis terbaru, karena tidak diketahui apa proporsi gambar yang akan diunggah pelanggan, jadi, Terkadang tidak ada cara untuk menentukan proporsi gambar. Penulis halaman depan biasanya menggunakan metode memperbaiki tinggi dan lebar elemen img untuk mengontrol gambar agar tidak meluap. Namun jika proporsi gambar tidak sesuai proporsi yang disyaratkan, maka akan menyebabkan gambar berubah bentuk setelah dipanggil. Hal ini sangat mempengaruhi keindahan halaman. Salah satu solusinya adalah dengan menskalakannya sesuai dengan proporsi gambar aslinya. Gambar yang diperskalakan pasti akan memiliki ruang kosong. Isi ruang kosong tersebut dengan warna. Dengan cara ini, meskipun gambar tidak akan berubah bentuk, namun akan terjadi banyak distorsi tinggi tetapi memiliki lebar rata-rata, dan jika dikompresi menjadi gambar 1:1, pada dasarnya gambar tersebut tidak akan terlihat setelah dikompresi.
Solusi saya di sini adalah memotong gambar apa pun ke ukuran tetap, gambar tidak akan berubah bentuk, dan ruang kosong akan diregangkan dan diisi. Gambar akan selalu terisi tanpa ruang kosong. Teman yang pernah menggunakan bcastr harus tahu bahwa bcastr memastikan bahwa panggilan gambar tidak akan berubah bentuk. , untuk bingkai gambar keluaran berukuran tetap, gambar sumber memiliki situasi berikut:
1: Tinggi dan lebar gambar yang akan dihasilkan lebih kecil dari tinggi dan lebar gambar sumber, ditulis sebagai penilaian $new_width<$src_width && $new_height<$src_width
2: Tinggi dan lebar gambar yang akan dihasilkan lebih besar dari tinggi dan lebar gambar asli, ditulis sebagai penilaian $new_width>$src_width && $new_height>$src_width
3: Kecualikan dua tipe 1 dan 2, yaitu situasi memperbesar dan memperkecil secara bersamaan ditambah penilaian persamaan. Untuk 1 dan 2, kode pemrosesan fungsi sama persis, sehingga dapat diringkas menjadi satu pernyataan pemrosesan
untuk memberikan kode implementasi PHP
<?php
/*
*Deskripsi: Fungsinya adalah untuk memotong gambar menjadi gambar dengan ukuran berapa pun tanpa merusak gambar.
* Deskripsi parameter: Masukkan nama file gambar yang akan diproses, buat nama file penyimpanan gambar baru, buat lebar gambar baru, dan buat tinggi gambar baru.
* ditulis oleh ayam kecil
* waktu 2008-12-18
*/
// Dapatkan gambar dengan ukuran berapa pun, regangkan bagian yang hilang, tanpa deformasi, tanpa ruang kosong
fungsi my_image_resize($src_file, $dst_file, $new_width, $new_height) {
if($lebar_baru <1 || $tinggi_baru <1) {
echo "kesalahan lebar dan tinggi parameter!";
KELUAR();
}
if(!file_exists($src_file)) {
echo $src_file " tidak ada ! ";
KELUAR();
}
//Jenis gambar
$type=exif_imagetype($src_file);
$support_type=array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
if(!in_array($type, $support_type,true)) {
echo "gambar jenis ini tidak mendukung! hanya mendukung jpg, gif atau png";
KELUAR();
}
//Muat gambar
beralih($tipe) {
kasus IMAGETYPE_JPEG :
$src_img=gambarbuatdarijpeg($src_file);
merusak;
kasus IMAGETYPE_PNG :
$src_img=gambarbuatdaripng($src_file);
merusak;
kasus IMAGETYPE_GIF :
$src_img=gambarbuatdarigif($src_file);
merusak;
bawaan:
echo "Kesalahan saat memuat gambar!";
KELUAR();
}
$w=gambarx($src_img);
$h=gambar($src_img);
$rasio_w=1,0 * $lebar_baru / $w;
$rasio_h=1,0 * $tinggi_baru / $h;
$rasio=1,0;
// Tinggi dan lebar gambar yang dihasilkan lebih kecil atau lebih besar dari aslinya. Prinsipnya adalah memperbesar dengan rasio besar dan memperkecil dengan rasio besar (rasio yang diperkecil akan semakin kecil)
if( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
if($rasio_w < $rasio_h) {
$ratio = $ratio_h ; // Kasus 1, rasio lebar lebih kecil dari arah tinggi, potong atau perbesar sesuai standar rasio tinggi
}kalau tidak {
$rasio = $rasio_w ;
}
// Tentukan gambar sementara perantara yang rasio aspeknya benar-benar memenuhi persyaratan target
$inter_w=(int)($lebar_baru / $rasio);
$inter_h=(int) ($tinggi_baru / $rasio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
imagecopy($inter_img, $src_img, 0,0,0,0,$inter_w,$inter_h);
// Hasilkan gambar sementara dengan panjang sisi maksimum sesuai rasio $rasio gambar target
//Tentukan gambar baru
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopyresampled($new_img,$inter_img,0,0,0,0,$new_width,$new_height,$inter_w,$inter_h);
beralih($tipe) {
kasus IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // Simpan gambar
merusak;
kasus IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
merusak;
kasus IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
merusak;
bawaan:
merusak;
}
} // berakhir jika 1
// 2 Satu sisi gambar target lebih besar dari gambar asli, dan satu sisi lebih kecil dari gambar asli. Pertama-tama perbesar gambar biasa, lalu potong.
// =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
kalau tidak{
$ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; //Ambil nilai dengan rasio yang lebih besar
// Tentukan gambar besar di tengah, tinggi atau lebar gambar sama dengan gambar target, lalu perbesar gambar aslinya
$inter_w=(int)($w * $rasio);
$inter_h=(int) ($h * $rasio);
$inter_img=imagecreatetruecolor($inter_w , $inter_h);
//Pangkas gambar asli setelah menskalakannya
imagecopyresampled($inter_img,$src_img,0,0,0,0,$inter_w,$inter_h,$w,$h);
//Tentukan gambar baru
$new_img=imagecreatetruecolor($new_width,$new_height);
imagecopy($new_img, $inter_img, 0,0,0,0,$new_width,$new_height);
beralih($tipe) {
kasus IMAGETYPE_JPEG :
imagejpeg($new_img, $dst_file,100); // Simpan gambar
merusak;
kasus IMAGETYPE_PNG :
imagepng($new_img,$dst_file,100);
merusak;
kasus IMAGETYPE_GIF :
imagegif($new_img,$dst_file,100);
merusak;
bawaan:
merusak;
}
}//jika3
}// fungsi akhir
?>