홈페이지 호출 이미지를 만들려면 홈페이지의 이미지 위치를 대개 디자이너가 지정하기 때문에 고정된 크기의 이미지를 얻어야 하는 경우가 있습니다. 고객이 업로드할 이미지의 비율이 어느 정도인지에 따라 이미지의 비율을 결정할 수 없는 경우가 있습니다. 프런트 엔드 페이지 작성자는 일반적으로 이미지가 넘치지 않도록 img 요소의 높이와 너비를 고정하는 방법을 사용합니다. 그러나 이미지의 비율이 요구되는 비율이 아닌 경우 호출 후 이미지가 변형될 수 있으며 이는 페이지의 아름다움에 큰 영향을 미칩니다. 크기가 조정된 이미지에는 필연적으로 공백이 생기고, 그 공백을 색상으로 채웁니다. 이렇게 하면 이미지가 변형되지는 않지만, 예를 들어 사용자가 다음과 같은 이미지를 보내는 경우 문제가 많이 발생합니다. 키는 매우 크지만 너비는 평균이며, 1:1 이미지로 압축하면 기본적으로 압축 후 이미지가 표시되지 않습니다.
해결책은 이미지를 고정된 크기로 자르는 것입니다. 그러면 이미지가 변형되지 않고, 공백이 늘어나서 채워집니다. bcastr을 사용해 본 친구들은 알아야 합니다. bcastr은 호출 시 이미지가 변형되지 않도록 보장합니다. 고정 크기 출력 이미지 프레임의 경우 소스 이미지에는 다음과 같은 상황이 있습니다.
1: 출력할 이미지의 높이와 너비가 원본 이미지의 높이와 너비보다 작으며 $new_width$src_width && $new_height>$src_width 판단으로 작성됩니다.
3: 1번과 2번 두 가지 유형, 즉 확대하면서 축소하는 상황과 동등하다고 판단하는 상황을 제외한다.
1번과 2번의 경우 함수 처리 코드가 완전히 동일하므로 하나의 처리문으로 요약할 수 있습니다
php 구현 코드
-
- /*
- * 설명: 이미지 변형 없이 이미지를 임의의 크기로 자르는 기능입니다
- * 매개변수 설명: 처리할 이미지의 파일명 입력, 새 이미지의 저장 파일명 생성, 새 이미지의 너비 생성, 새 이미지의 높이 생성
- * writing by smallchicken
- * 시간 2008-12-18
- */
- // 원하는 크기의 이미지 가져오기, 누락된 부분 늘리기, 변형 없음, 공백 없음
- function my_image_resize($src_file, $dst_file, $ new_width, $new_height) {
- if($ new_width <1 || $new_height <1) {
- echo "매개변수 너비 또는 높이 오류 !"
- exit()
- }
- if(!file_exists($src_file)) {
- echo $src_file . "이 존재하지 않습니다!"
- exit()
- }// 이미지 유형
- $type= EXIF_imagetype($src_file);
- $support_type= array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);
- if(!in_array($type, $support_type,true)) {
- echo "이 유형의 이미지는 jpg, gif 또는 png만 지원합니다.";
- exit();
- }
- //이미지 로드
- switch($type) {
- case IMAGETYPE_JPEG :
- $src_img= imagecreatefromjpeg($src_file);
- break;
- case IMAGETYPE_PNG:
- $src_img=imagecreatefrompng($src_file);
- break;
- case IMAGETYPE_GIF:
- $src_img=imagecreatefromgif );
- 기본값:
- echo "이미지 로드 오류!"
- exit()
- $w=imagesx($src_img); h=imagesy($src_img);
- $ ratio_w=1.0 * $new_width / $w;
- $ratio_h=1.0 * $new_height / $h;
- $ratio=1.0; 생성된 이미지의 높이와 너비가 원본보다 작거나 모두 큰 경우 큰 비율로 확대, 큰 비율로 축소하는 것이 원칙입니다(축소 비율은 작아집니다)
- ( ($ratio_w < 1 && $ratio_h < 1) || ($ratio_w > 1 && $ratio_h > 1)) {
- if($ratio_w < $ratio_h) {
- $ratio = $ ratio_h ; // 사례 1, 높이 비율 기준에 따라 너비 비율이 높이 비율보다 작습니다. 자르기 또는 확대
- }else {
- $ratio = $ratio_w }
- / / 가로세로 비율이 목표 요구 사항을 정확히 충족하는 중간 임시 이미지를 정의합니다
- $inter_w= (int)($new_width / $ratio)
- $inter_h=(int) ($new_height / $ratio); >$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);
- switch($type) {
- case IMAGETYPE_JPEG :
- imagejpeg($new_img, $dst_file,100); // 이미지 저장
- break;
- case IMAGETYPE_PNG :
- imagepng($new_img ,$dst_file,100)
- break;
- case IMAGETYPE_GIF :
- imagegif($new_img,$dst_file ,100);
- break;
- default:
- break;
- }
- } // 1인 경우 종료
- // 2 대상 이미지의 한쪽이 원본 이미지보다 큽니다. , 한쪽이 원본 이미지보다 작습니다. 먼저 일반 이미지를 확대한 다음 잘라냅니다.
- // =if( ($ratio_w < 1 && $ratio_h > 1) || ($ratio_w >1 && $ratio_h <1) )
- else{
- $ratio=$ratio_h>$ratio_w? $ratio_h : $ratio_w; / /더 큰 비율로 값을 가져옵니다
- // 큰 중간 이미지를 정의합니다. 높이 또는 너비가 대상 이미지와 동일하고 원본 이미지를 확대합니다
- $inter_w=(int)($w * $ratio )
- $inter_h=(int) ($h * $ratio) ;
- $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);
- switch($type) {
- case IMAGETYPE_JPEG :
- imagejpeg($ new_img, $dst_file,100) // 이미지 저장
- break; >case IMAGETYPE_PNG :
- imagepng($new_img,$dst_file,100);
- break
- case IMAGETYPE_GIF :
- imagegif($new_img,$dst_file,100)
- default:
- break;
- }
- }// if3
- }// 함수 종료
- ? >
-
-
- 코드 복사
-
-
-
-
-
-
|