?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form
라이선스 기타(따로 작성)

안녕하세요?


오늘 SIR에 올라온 Q&A 글 중에서 마침 제가 예전에 작성해놓은 스크립트를 조금 수정하면 처리 가능한 질문이 있더군요.


쟁쟁하신 다른 회원님들에 비해 제가 실력은 많이 부족하지만 운좋게 답변 채택을 받았습니다 :)


1) 원본 이미지는 그대로 두고, 2) 원본 파일의 비율은 유지하되, 


이미지를 원하는 크기로 축소/확대한 RAW 데이터를 리턴하여 출력하는 스크립트입니다.


방금 살짝 수정을 했지만 여전히 스크립트가 여러모로 지저분하고 군더더기가 많네요 ㅠㅠ


그래도 PNG와 JPG 파일을 테스트해봤는데 잘 리사이즈되니 다행이에요~!


<?php
function resize_image($file, $dst_w, $dst_h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $ratio = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*abs($ratio-$dst_w/$dst_h)));
        } else {
            $height = ceil($height-($height*abs($ratio-$dst_w/$dst_h)));
        }
        $newwidth = $dst_w;
        $newheight = $dst_h;
    } else {
        if ($dst_w/$dst_h > $ratio) {
            $newwidth = $dst_h*$ratio;
            $newheight = $dst_h;
        } else {
            $newheight = $dst_w/$ratio;
            $newwidth = $dst_w;
        }
    }
   
    $exploding = explode(".",$file);
    $ext = end($exploding);
    switch($ext){
        case "png":
            $src = imagecreatefrompng($file);
        break;
        case "jpeg":
        case "jpg":
            $src = imagecreatefromjpeg($file);
        break;
        case "gif":
            $src = imagecreatefromgif($file);
        break;
        default:
            $src = imagecreatefromjpeg($file);
        break;
    }
   
    $result = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($result, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    return array($result, $ext);
}
$img = resize_image('PATH', WIDTH, HEIGHT); // 파일경로, 폭, 높이를 입력하세요
ob_start();
switch($img[1]){
    case "png":
        imagepng($img[0]);
    break;
    case "jpeg":
    case "jpg":
        imagejpeg($img[0]);
    break;
    case "gif":
        imagegif($img[0]);
    break;
    default:
        imagejpeg($img[0]);
    break;
}
$output = base64_encode(ob_get_contents());
ob_end_clean();
?>
<img src="data:image/<?php echo $img[1]; ?>;base64,<?php echo $output; ?>"/>


이미지 처리 과정에서 서버의 리소스를 적지 않게 사용하겠지만, 이미지를 적절히 축소하면 트래픽 절감의 효과는 있겠네요 ^^


스크립트에서 사용된 함수는 아래 URL의 스크립트를 참조하였습니다.

https://ourcodeworld.com/articles/read/197/how-to-resize-an-image-and-reduce-quality-in-php-without-imagick


그럼 즐겁고 뜻깊은 연말 되세요 ^^


여러모로 부족한 스크립트를 읽어주셔서 감사합니다~!

  • profile
    title: 황금 서버 (30일)humit 2018.12.29 11:40
    몇 가지 추가하자면 base64로 출력하는 경우 html의 캐싱을 허용해놓지 않으면 캐싱으로 인한 효과를 볼 수 없다는 단점이 있습니다.
    그래서 base64로 출력하기보다는 리사이즈한 이미지를 따로 파일로 저장해서 뿌려주는 것이 좋을 수도 있습니다.
    이렇게 하면 여러 번을 불러오더라도 캐싱이 되어 있으므로 서버에 무리가 가지 않는다는 장점이 있습니다.
  • profile
    이니스프리 2018.12.29 11:59
    제가 미처 캐싱까지 생각하지 못했군요 ㅠㅠ
    말씀해주셔서 감사합니다~!
    실사용할 때에는 리사이즈한 이미지를 다시 파일로 저장하도록 해야겠네요.
    이제 36시간 정도 남으신 것 같은데 전역을 미리 축하드립니다 :)
    날씨가 추운데 humit 님께서도 감기 조심하세요!
  • profile
    title: 황금 서버 (30일)humit 2018.12.29 12:11
    전역 축하 감사합니다 ㅎㅎ
  • profile
    title: 황금 서버 (30일)humit 2018.12.29 11:58

    그리고 만약 resize_image 함수의 인자를 사용자에 의해서 받을 수 있다면 XSS 공격도 가능합니다.

    한 예로 $file의 인자로 "><script>alert('XSS')</script>/img 를 주게 되면 $ext 부분이 "><script>alert('XSS')</script>/img 로 들어가기 때문에 XSS가 성공할 수 있게 됩니다.

    따라서 switch($ext) case default 부분에서 $ext = "jpeg"로 주는 것이 필요합니다. 

  • profile
    이니스프리 2018.12.29 12:04
    허걱 ㅠㅠ 이건 제가 전혀 생각하지 못했던 부분이네요~!
    그런 방식으로 XSS가 가능하군요 ㄷㄷ
    그 부분은 반드시 반영을 해야겠네요!!
    보안의 세계는 참 어렵네요 ㅠㅠ
    부대에서 드시는 식사가 연말이라고 맛있을 것 같지는 않지만 점심식사 맛있게 드세요~ ^^
  • profile
    title: 황금 서버 (30일)humit 2018.12.29 12:12
    아무래도 창과 방패의 싸움에서 창이 유리할 수밖에 없는 것 같더군요...
    방패는 모든 부분을 방어해야 하지만 창은 한 쪽만 공략하면 되니까요 ㅋㅋㅋ

  1. [Python] 선택한 파일을 Dropbox API를 이용하여 업로드하고 공유링크를 받아서 이미지 호스팅 용도로 URL을 변환하기

    Date2019.07.02 Category코드 By이니스프리 Views1192
    Read More
  2. [JS]클라이언트에서 Ip를 얻어보자

    Date2019.01.21 Category코드 ByHanam09 Views807
    Read More
  3. [JS] http를 https로 리디렉션!

    Date2018.12.30 Category코드 ByHanam09 Views885
    Read More
  4. [PHP] 이미지를 원하는 크기(원본비율 유지)로 리사이즈 하여 출력 (원본 이미지는 수정하지 않습니다)

    Date2018.12.20 Category코드 By이니스프리 Views8016
    Read More
  5. [아미나] 네이트 실시간 검색어 순위 위젯 (아미나 캐시 적용)

    Date2018.12.18 Category코드 By이니스프리 Views1134
    Read More
  6. [아미나] 출석 여부를 나타내는 메인화면 위젯

    Date2018.12.15 Category코드 By이니스프리 Views811
    Read More
  7. [PHP] 간단한 캐싱 클래스

    Date2018.12.06 Category코드 Bytitle: 황금 서버 (30일)humit Views882
    Read More
  8. [Python] 텔레그램을 이용한 게시판 새 글 알림봇

    Date2018.12.02 Category코드 By이니스프리 Views4030
    Read More
  9. [아미나] 게시글을 작성하면 ID와 IP로 필터링하여 자동으로 랜덤 댓글을 남기기 (+랜덤 포인트)

    Date2018.11.18 Category코드 By이니스프리 Views814
    Read More
  10. [PHP] 그누보드 자동 게시글 작성 - 일본기상협회의 우리나라 날씨를 크롤링한 후 파파고로 번역하여 글 작성

    Date2018.11.15 Category코드 By이니스프리 Views844
    Read More
  11. [PHP] 기상청 RSS 시간별 예보 위젯 - cache 적용(?)

    Date2018.10.28 Category코드 By이니스프리 Views1003
    Read More
  12. [오토핫키] 브라우저를 열어 지난번과 동일한 폴더에 MZK를 다운받고 압축을 네이티브로 해제하는 스크립트

    Date2018.10.20 Category코드 By이니스프리 Views928
    Read More
  13. [PHP] 기상청 중기예보를 캐러셀로 보여주는 위젯 (매우 허접합니다 ㅠㅠ)

    Date2018.09.28 Category코드 By이니스프리 Views756
    Read More
  14. [오토핫키] 구글 드라이브의 공유링크를 이미지 호스팅을 위한 다이렉트 링크로 바꿔주는 스크립트

    Date2018.09.25 Category코드 By이니스프리 Views1778
    Read More
  15. [오토핫키] 특정 사이트에 대한 ping 테스트 결과를 실행시간과 함께 로그 파일로 저장하는 스크립트

    Date2018.09.22 Category코드 By이니스프리 Views2102
    Read More
  16. [Python] 모 정부기관 사이트 파싱 후 PC 통신처럼 열람하고 싶은 게시글 번호를 입력하면 내용을 보여주는 소스 (허접)

    Date2018.09.14 Category코드 By이니스프리 Views755
    Read More
  17. 파이선 셸에서 실행하면...?

    Date2018.07.22 Category코드 By제르엘 Views631
    Read More
  18. C언어 삼중자를 이용한 코드

    Date2018.07.22 Category코드 Bytitle: 황금 서버 (30일)humit Views504
    Read More
  19. 폰트를 자동 설치하는 코드

    Date2018.07.16 Category코드 By네모 Views1020
    Read More
  20. 잘못 쓰면 컴퓨터가 날아가는 코드

    Date2018.07.08 Category코드 By제르엘 Views1048
    Read More
Board Pagination Prev 1 2 3 4 Next
/ 4