• 목록
  • 아래로
  • 위로
라이선스 기타(따로 작성)

안녕하세요?


오늘 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


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


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

Seia님 Seia 포함 1명이 추천

추천인 1

작성자
이니스프리 95 Lv. (61%) 731420/737280EXP

ཇོ་མོ་གླང་མ

댓글 6

title: 황금 서버 (30일)humit
profile image
몇 가지 추가하자면 base64로 출력하는 경우 html의 캐싱을 허용해놓지 않으면 캐싱으로 인한 효과를 볼 수 없다는 단점이 있습니다.
그래서 base64로 출력하기보다는 리사이즈한 이미지를 따로 파일로 저장해서 뿌려주는 것이 좋을 수도 있습니다.
이렇게 하면 여러 번을 불러오더라도 캐싱이 되어 있으므로 서버에 무리가 가지 않는다는 장점이 있습니다.
comment menu
2018.12.29. 11:40

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image
제가 미처 캐싱까지 생각하지 못했군요 ㅠㅠ
말씀해주셔서 감사합니다~!
실사용할 때에는 리사이즈한 이미지를 다시 파일로 저장하도록 해야겠네요.
이제 36시간 정도 남으신 것 같은데 전역을 미리 축하드립니다 :)
날씨가 추운데 humit 님께서도 감기 조심하세요!
comment menu
2018.12.29. 11:59

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image
전역 축하 감사합니다 ㅎㅎ
comment menu
2018.12.29. 12:11

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit
profile image

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

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

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

comment menu
2018.12.29. 11:58

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image
허걱 ㅠㅠ 이건 제가 전혀 생각하지 못했던 부분이네요~!
그런 방식으로 XSS가 가능하군요 ㄷㄷ
그 부분은 반드시 반영을 해야겠네요!!
보안의 세계는 참 어렵네요 ㅠㅠ
부대에서 드시는 식사가 연말이라고 맛있을 것 같지는 않지만 점심식사 맛있게 드세요~ ^^
comment menu
2018.12.29. 12:04

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image
아무래도 창과 방패의 싸움에서 창이 유리할 수밖에 없는 것 같더군요...
방패는 모든 부분을 방어해야 하지만 창은 한 쪽만 공략하면 되니까요 ㅋㅋㅋ
comment menu
2018.12.29. 12:12

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 분류 제목 글쓴이 날짜 조회 수
코드 [PHP] 이미지를 원하는 크기(원본비율 유지)로 리사이즈 하여 출력 (원본 이미지는 수정하지 않습니다) 6 이니스프리 이니스프리 18.12.20.18:42 3030
75 코드 새 글 자동 댓글 스크립트 (AutoHotkey) 9 이니스프리 이니스프리 17.11.26.20:22 1999
74 코드 파이썬을 이용한 텔레그램 새 글 알림 (허접합니다) 5 이니스프리 이니스프리 17.11.19.18:55 1806
73 코드 [Python] 텔레그램을 이용한 게시판 새 글 알림봇 7 이니스프리 이니스프리 18.12.02.16:25 1697
72 코드 [파이썬] Requests를 사용한 네이버 카페 크롤링 - 일정수 이상의 리플이 달린 게시글만 텔레그램 알림 3 image 이니스프리 이니스프리 19.11.17.15:20 1539
71 코드 [Python] Selenium을 이용하여 특정 element를 캡처하는 스크립트 2 image 이니스프리 이니스프리 19.07.03.20:17 1485
70 코드 [Python] 싸이월드 미니홈피 백업 스크립트 이니스프리 이니스프리 19.11.07.20:06 1190
69 코드 [오토핫키] 구글 드라이브의 공유링크를 이미지 호스팅을 위한 다이렉트 링크로 바꿔주는 스크립트 10 image 이니스프리 이니스프리 18.09.25.16:54 1095
68 코드 엑셀 읽어서 그래프 그려주는 함수 2 왕뚠뚠돈까스라이츄 title: 인스타그램왕뚠뚠돈까스.. 17.08.03.22:06 1045
67 코드 CMD로 로컬 연결 고정 IP 설정하기 1 humit title: 황금 서버 (30일)humit 18.02.06.11:33 879
66 코드 유튜브에 약간의 기능을 추가 해주는 크롬 확장 프로그램. 11 image Hanam09 Hanam09 18.01.26.22:01 830
65 코드 [오토핫키] 특정 사이트에 대한 ping 테스트 결과를 실행시간과 함께 로그 파일로 저장하는 스크립트 2 이니스프리 이니스프리 18.09.22.10:59 771
64 코드 잘못 쓰면 컴퓨터가 날아가는 코드 29 제르엘 title: 생일 케이크 (1년권)제르엘 18.07.08.22:36 740
63 자료 even_move - 감성적인 에러 페이지 7 image TVJ title: 열려라 맛스타의 자물쇠TVJ 17.08.08.22:36 669
62 자료 소셜XE / 기존 통합 로그인 스킨 V2.2 2 image 맛스타 title: 생일 케이크 (1년권)맛스타 17.06.28.00:10 648
61 자료 AdminLTE용 에디터 스타일 4 file title: 은메달도다 17.07.07.20:48 620
60 코드 [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합 11 image 이니스프리 이니스프리 19.07.12.01:22 617
59 코드 엑셀파일 불러서 히스토그램 그려주는 함수 왕뚠뚠돈까스라이츄 title: 인스타그램왕뚠뚠돈까스.. 17.08.03.21:53 599
58 코드 사이트 서버 이전 (또는 미러링 사이트 구축) 쉽게하는 스크립트 1 맛스타 title: 생일 케이크 (1년권)맛스타 18.01.14.01:09 598
57 코드 [아미나] Dropbox API를 이용한 이미지 호스팅 보드스킨 11 image 이니스프리 이니스프리 19.07.13.10:01 593