>  기사  >  백엔드 개발  >  PHP 이미지 자동 자르기

PHP 이미지 자동 자르기

巴扎黑
巴扎黑원래의
2016-11-12 09:54:311267검색

그런 포털 사이트를 해본 적이 있다면, 사진이 다양한 위치에, 다양한 크기와 비율로 표시될 수 있다는 것을 아셔야 합니다.

사진을 하나만 사용한다면 반드시 그렇게 될 것입니다. 변형될 것이고, 작은 이미지가 표시되는 큰 이미지에 연결하는 것은 너무 낭비적입니다... 예를 들어, 썸네일을 사용하여 처리하는 것은 장소마다 나타나는 비율과 크기가 다를 수 있기 때문에 완벽하지 않습니다. !!!!!!!!!!!!



위 사진을 참고해주세요.

여기서 실제로 전송되는 것은 목록인데 사진의 크기가 다르고, 어떤 것은 넓고 어떤 것은 좁은데, 이런 상황이 닥쳤을 때 어떻게 해야 할까요? ? 원본 주소를 직접 사용하면 확실히 변형됩니다. 이 전송은 자동으로 전송됩니다.

--- -------------------------------- ----- -------------------------------- ----- -------------

본론으로 들어가겠습니다:

저는 항상 PHP 자동 자르기라는 방법을 사용해 왔습니다... 혹시 본 적이 있나요? 비슷한 사진 주소가 있나요? /aaaa/abc_200_100.jpg 또는 /aaaa/abc_200*100.jpg

내 방법은 이 사진 주소를 사진이 필요한 위와 유사한 주소로 변환하는 것입니다. , 아파치 재작성을 통해 핸들러에 전달됩니다. 너비와 높이를 기준으로 이미지를 생성하고 저장합니다.

이 작업을 수행하면 여러 가지 이점이 있습니다.

첫째, 사진이 있는 곳에서는 매우 유연하여 변형 없이 원하는 만큼 넓거나 높게 제어할 수 있으며, 프로그램은 항상 최대 사진 콘텐츠를 표시합니다.

둘째, 사진이 나올 때 한 번 생성되면 Apache는 다음 번에는 프로그램으로 리디렉션하지 않습니다. 왜냐하면 규칙 앞에 !d !f라는 판단이 있기 때문입니다. 이는 현재 파일이 존재하지 않는 경우에만 리디렉션된다는 의미입니다. 사진이 존재하면 다시 나오지 않습니다.

아쉬운 점은 사진이 더 많이 생성되고 공간을 더 많이 차지한다는 점입니다. 자체 서버 상관없습니다. 분류해서 정리하시면 됩니다

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

function Crop_img($img , $width = 200, $height = 200) {

$img_info =parse_url($img);

/* 외부 링크는 이미지 주소를 직접 반환합니다 * /

if (!empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) {

                                                                                 

            $pos = strrpos($img, '.') $height . substr($img, $pos);

return $img;

}

}

function img ($img,$width,$height){

$img_info =parse_url($img);

/* 외부 링크 이미지 주소를 직접 반환 */

if ( !empty($img_info['host']) && $img_info['host'] != $_SERVER['HTTP_HOST']) {

>>          $pos = strrpos($img, '.') 높이 . substr($img, $pos);

echo '';

return ;

} ','width','height' ); 이 함수는 처리된 이미지 주소를 반환합니다. img 함수는 이미지 라벨 문자열을 직접 반환합니다. 예를 들어 discuz 템플릿에서 이 함수를 호출합니다. {eval img($pic,200,100)}

이 방법은 /data/attachment/forum/aaaaaa_200_100.jpg 현재 이 이미지가 존재하지 않으므로 두 번째 단계를 살펴보세요

두 번째 단계에서는 Apache 재작성 규칙을 추가해야 합니다

RewriteEngine 켜짐

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/ 첨부파일/' . preg_replace('/_(d+)_(d+)/', '', $url);

$filename = './data/attachment/' . $url;

 

if (file_exists($filename)) {

    ob_start();

    header('Content-type:image/jpeg ');

    readfile($filename);

    ob_flush();

    flash();

} else {

if(!preg_match('/_(d+)_(d+)/', $url, $wh)){

          defulat();

          exit();

    }

    $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 = $width;   //缩略图宽

        $thumbHeight = $height; //缩略图高

        $_x = 0;

        $_y = 0;

        $w = $sourceWidth;

        $h = $sourceHeight ;

        if ($mode == 'scale') {

            if ($sourceWidth <= $thumbWidth && $sourceHeight <= $thumbHeight) {

                $

               $thumbHeight = $sourceHeight;

           } else {

               if ($thumbHeight * $sourceWidth > $thumbWidth * $sourceHeight) {

                    $thumbHeight = 바닥($sourceHeight * $width / $sourceWidth);

                   $_y = 바닥(($height - $thumbHeight) / 2);

              } else {

정의 }

        } else if ($mode == 'crop') {

            if ($sourceHeight < $thumbHeight) { //如果原图尺寸小于当前尺寸   

               $thumbWidth = Floor($thumbWidth * $sourceHeight / $thumbHeight);

                $thumbHeight = $sourceHeight;

                $thumbWidth = $ sourceWidth;

            }

 

                 $s1 = $sourceWidth / $sourceHeight;                                                                                                                                                  s2) {

                                                                                                                    ;

                              $ax = Floor($sourceWidth * ($thumbHeight / $sourceHeight));

                       $x = ($ax - $thumbWidth) / 2; $sourceHeight);

                                                                     $ay = Floor($sourceHeight * ($ ThumbWidth / $sourceWidth)); 원본 이미지

$y = ($ay - $thumbHeight) / 2;

sourceWidth);

                                                    사례 2: $source = imagecreatefromjpeg($src);

break;

사례 1: $source = imagecreatefromgif($src);

break;

사례 3: $ source = imagecreatefrompng($src);

break;

사례 6: $source = imagecreatefromwbmp($src);

break;

기본값: defulat();

                                     ; 너비, $height);

imagefill($thumb, 0, 0, imagecolorallocate($thumb, 255, 255, 255));

imagecopy 리샘플링($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, $ 파일 이름, $quality);

                                                                      예) {

풀라트();

}

}

function defulat() {

$default_img = realpath('media/images/nopic.jpg');

ob_start();

헤더(' 콘텐츠 유형:이미지/jpeg');

readfile($default_img);

ob_flush();

플러시();

}

엄지손가락 기능으로 자르기 방법을 제어할 수 있습니다. 배율은 비례 배율, 자르기 없음, 부족한 영역은 흰색으로 채워지고 자르기는 자르기입니다. 필요한 가로 세로 비율이 원본 이미지 가로 세로 비율보다 크면 그대로 유지합니다. 최대 표시 너비, 위쪽 및 아래쪽 초과 부분을 중앙에서 자릅니다. 가로 세로 비율이 원본 이미지 가로 세로 비율보다 작아야 하는 경우 최대 높이를 유지하고 왼쪽 및 오른쪽 초과 부분을 가운데에서 자릅니다. 이미지를 변형하지 않고 최대한 유지합니다. ㅎㅎ, 이 코드가 얼마나 복잡한지 한번 해보면 당연히 재작성 기능과 GD2 지원이 필요하다는 것을 알 수 있을 것입니다. 🎜>

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP 상수다음 기사:PHP 상수