>  기사  >  백엔드 개발  >  다양한 크기의 PHP 기술 표시에 맞게 PHP 그림이 자동으로 잘립니다.

다양한 크기의 PHP 기술 표시에 맞게 PHP 그림이 자동으로 잘립니다.

WBOY
WBOY원래의
2016-05-16 20:34:45996검색

이런 포털 사이트를 해보신 분이라면 사진이 다양한 위치에, 다양한 크기와 비율로 표시될 수 있다는 점을 아셔야 합니다.
한 장의 사진만 사용하면 당연히 변형이 되고, 작은 사진이 표시되는 곳에 큰 사진을 연결하는 것도 너무 아깝습니다... 썸네일을 이용해서 처리하는 것은 여기저기서 나타나기 때문에 완벽하지 않습니다. 비율이 다를 수 있습니다. , 예시입니다!

위 사진을 참고해주세요.

이곳에서 실제로 전송되는 것은 목록인데 사진의 크기가 다르고 어떤 것은 넓고 어떤 것은 좁습니다. 이런 상황이 발생하면 어떻게 해야 할까요? 썸네일을 사용하는 것은 신뢰할 수 없습니다. 이 조정은 사진에 필요한 너비와 높이를 알 수 없습니다. ------------------------------------- ------------------------------------- ---------------
요점을 살펴보겠습니다:

저는 항상 PHP 자동 자르기라는 방법을 사용해 왔습니다. /aaaa/abc_200_100.jpg 또는 /aaaa/abc_200*100.jpg와 유사한 이미지 주소를 본 것과 비교하면

내 방법은 이미지가 필요한 위와 비슷한 주소로 이미지 주소를 변환한 후 Apache의 rewrite를 통해 처리 프로그램에 전달하는 것입니다. 너비와 높이를 기준으로 이미지를 생성하고 저장합니다.

이렇게 하면 몇 가지 이점이 있습니다.

첫째, 사진이 있는 곳이라면 어디든 변형 없이 원하는 만큼 넓거나 높게 조절할 수 있으며, 프로그램은 항상 최대 사진 콘텐츠를 표시합니다

둘째, 이미지가 한 번 생성되면 Apache는 다음 번에는 프로그램으로 리디렉션하지 않습니다. 왜냐하면 규칙 앞에 !d !f 판단이 있기 때문입니다. 이는 현재 파일이 존재하지 않을 때까지 리디렉션되지 않는다는 의미입니다. .다음번에 사진이 존재할 때 다시는 나타나지 않고 실제 사진이 됩니다

단점은 생성되는 사진이 많아지고 공간을 많이 차지할 수 있다는 점이지만, 자체 서버라면 상관없지만 카테고리별로 정리하면 됩니다

좋아요, 코드는 다음과 같습니다. discuz를 예로 들어보겠습니다

코드 복사 코드는 다음과 같습니다.
함수 Crop_img($img, $width = 200, $height = 200) {
$img_info = 구문 분석 URL($img);
/* 외부 링크는 이미지 주소를 직접 반환합니다. */
if (!empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) {
$img 반환
} 그 밖의 {
$pos = strrpos($img, '.');
$img = substr($img, 0, $pos) . $width . $height .substr($img, $pos);
$img 반환
}
}

함수 img($img,$width,$height){
$img_info = 구문 분석 URL($img);
/* 외부 링크는 이미지 주소를 직접 반환합니다. */
if (!empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) {
$img 반환
} 그 밖의 {
$pos = strrpos($img, '.');
$img = substr($img, 0, $pos) . $width . $height .substr($img, $pos);
echo '';
복귀 ;
}
}

함수 사용법 Crop_img('original image address', 'width', 'height'); 이 함수는 처리된 이미지 주소를 반환합니다. img 함수는 이미지 레이블 문자열을 직접 반환합니다. 예를 들어 discuz 템플릿에서 이 함수를 호출합니다. ( $pic,200,100)}
반환된 주소는 /data/attachment/forum/aaaaaa_200_100.jpg 입니다. 현재 이 이미지는 존재하지 않습니다. 그럼 2단계를 살펴보세요

2단계: Apache의 재작성 규칙을 추가해야 합니다

코드 복사 코드는 다음과 같습니다.
RewriteEngine 켜짐


RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^data/attachment/(.*)$ Images.php?url=$1 [L]




위의 내용은 data/attachment/ 시작 부분에 존재하지 않는 파일을 image.php로 보내서 처리하고, URL을 매개변수로 전달한다는 의미입니다

세 번째 부분은 image.php의 코드입니다


코드 복사 코드는 다음과 같습니다.


$url = $_GET['url'];
$src = './data/attachment/' . preg_replace('/_(d )_(d )/', '', $url);
$파일명 = './data/attachment/' . $url;

if (file_exists($filename)) {
ob_start();
header('콘텐츠 유형:이미지/jpeg');
파일 읽기($filename);
ob_flush();
플러시();
} 그 밖의 {
if(!preg_match('/_(d )_(d )/', $url, $wh)){
defulat();
종료();
}
$width = $wh[1];
$height = $wh[2];
Thumb(realpath($src), $width, $height, $filename, '자르기', '85');
}

function Thumb($src, $width, $height, $filename, $mode = 'scale', $quality = '100') {
시도해보세요 {
$imageValue = getimagesize($src);
$sourceWidth = $imageValue[0]; //원래
$sourceHeight = $imageValue[1]; //원래고
$thumbWidth = $너비; //缩略图宽
$thumbHeight = $높이; //缩略图高
$_x = 0;
$_y = 0;
$w = $sourceWidth;
$h = $sourceHeight;
if ($mode == 'scale') {
if ($sourceWidth <= $thumbWidth && $sourceHeight <= $thumbHeight) {
$_x = 바닥(($thumbWidth - $sourceWidth) / 2);
$_y = 바닥(($thumbHeight - $sourceHeight) / 2);
$thumbWidth = $sourceWidth;
$thumbHeight = $sourceHeight;
} 그 밖의 {
if ($thumbHeight * $sourceWidth > $thumbWidth * $sourceHeight) {
$thumbHeight = 바닥($sourceHeight * $width / $sourceWidth);
$_y = 바닥(($height - $thumbHeight) / 2);
} 그 밖의 {
$thumbWidth = 바닥($sourceWidth * $height / $sourceHeight);
$_x = 바닥(($width - $thumbWidth) / 2);
}
}
} else if ($mode == '자르기') {
if ($sourceHeight < $thumbHeight) { //如果原图尺寸小于当前尺寸
$thumbWidth = 바닥($thumbWidth * $sourceHeight / $thumbHeight);
$thumbHeight = $sourceHeight;
}
if ($sourceWidth < $thumbWidth) {
$thumbHeight = 바닥($thumbHeight * $sourceWidth / $thumbWidth);
$thumbWidth = $sourceWidth;
}

$s1 = $sourceWidth / $sourceHeight; //원래
$s2 = $너비 / $높이; //새로운 내용
if ($s1 == $s2) {

} else if ($s1 > $s2) { //전체 높이
$y = 0;
$ax = 바닥($sourceWidth * ($thumbHeight / $sourceHeight));
$x = ($ax - $thumbWidth) / 2;
$w = $thumbWidth / ($thumbHeight / $sourceHeight);

} else { //전체 크기
$x = 0;
$ay = 바닥($sourceHeight * ($thumbWidth / $sourceWidth)); //模拟原图比例고도
$y = ($ay - $thumbHeight) / 2;
$h = $thumbHeight / ($thumbWidth / $sourceWidth);
}

}
스위치($imageValue[2]) {
사례 2: $source = imagecreatefromjpeg($src);
휴식;
사례 1: $source = imagecreatefromgif($src);
휴식;
사례 3: $source = imagecreatefrompng($src);
휴식;
사례 6: $source = imagecreatefromwbmp($src);
휴식;
기본값: defulat();
반품;
}
header("콘텐츠 유형: image/jpeg");
$thumb = imagecreatetruecolor($width, $height);
imagefill($thumb, 0, 0, imagecolorallocate($thumb, 255, 255, 255));
imagecopyresampled($thumb, $source, 0, 0, $x, $y, $width, $height, $w, $h);
imagejpeg($thumb, null, $quality);
// if ($_SERVER['HTTP_REFERER'] || false !== Stripos($_SERVER['HTTP_REFERER'], 'http://' . $_SERVER['SERVER_NAME'])) {
imagejpeg($thumb, $filename, $quality);
// }
imagedestroy($thumb);
imagedestroy($source);
} 잡기(예외 $ex) {
defulat();
}
}

defulat() 함수 {
$default_img = realpath('media/images/nopic.jpg');
ob_start();
header('콘텐츠 유형:이미지/jpeg');
파일 읽기($default_img);
ob_flush();
플러시();
}

엄지 손가락 函数 可以控 제어 裁切方式, scale 为等比缩放,不裁切,不够的地方 用白color填充,crop 为裁切,如果要求的宽高比 大于原图宽高比,那么就保持最大显示宽島,居中裁切上下多余言分,如果要求宽高比小于原图宽高比,那么就保持最大高島,居中裁切左右多余分,总而言之,保持不变모양의 전하的内容.哈哈 这个代码有多叼,试试知道了,,,当然你需要支持rewrite功能和GD2 支持
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.