?

단축키

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
    아무래도 창과 방패의 싸움에서 창이 유리할 수밖에 없는 것 같더군요...
    방패는 모든 부분을 방어해야 하지만 창은 한 쪽만 공략하면 되니까요 ㅋㅋㅋ

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
38 코드 [Python] 네이버 실시간 검색어 3 title: 황금 서버 (30일)humit 2020.01.23 1122
37 코드 [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합 11 file 이니스프리 2019.07.12 1376
36 코드 [Python] url 주소로부터 IP 주소 알아내기 title: 황금 서버 (30일)humit 2020.02.20 2053
35 코드 [Python] Selenium을 이용하여 특정 element를 캡처하는 스크립트 2 file 이니스프리 2019.07.03 5901
34 코드 [Python] PIL을 이용한 Animated GIF의 리사이징 file 이니스프리 2019.11.03 1099
33 코드 [Python] Google Image Search 결과를 받아오기 file 이니스프리 2019.12.09 947
32 코드 [Python/Telegram] Studyforus 알림봇 (댓글, 스티커 파싱) 7 file 이니스프리 2020.05.15 644
31 코드 [Python-Gnuboard] 파이썬으로 구현한 그누보드 자동 글쓰기 함수 1 file 이니스프리 2021.04.08 1213
30 코드 [PyQt] sir.kr에서 스크랩한 게시글을 보여주는 윈도우앱 (검색 및 정렬 가능) 7 file 이니스프리 2019.08.09 997
» 코드 [PHP] 이미지를 원하는 크기(원본비율 유지)로 리사이즈 하여 출력 (원본 이미지는 수정하지 않습니다) 6 이니스프리 2018.12.20 7701
28 코드 [PHP] 기상청 중기예보를 캐러셀로 보여주는 위젯 (매우 허접합니다 ㅠㅠ) 10 file 이니스프리 2018.09.28 647
27 코드 [PHP] 기상청 RSS 시간별 예보 위젯 - cache 적용(?) 9 file 이니스프리 2018.10.28 849
26 코드 [PHP] 그누보드 자동 게시글 작성 - 일본기상협회의 우리나라 날씨를 크롤링한 후 파파고로 번역하여 글 작성 4 file 이니스프리 2018.11.15 655
25 코드 [PHP] 간단한 캐싱 클래스 3 title: 황금 서버 (30일)humit 2018.12.06 605
24 코드 [PHP/Javascript] 아미나에 자동으로 게시글을 생성하고 Ajax로 전송하여 결과를 표시하기 2 file 이니스프리 2019.07.09 775
23 코드 [JS]클라이언트에서 Ip를 얻어보자 2 Hanam09 2019.01.21 625
22 코드 [JS] 클라이언트단 GET Parameter Hanam09 2019.11.16 465
21 코드 [JS] http를 https로 리디렉션! 3 Hanam09 2018.12.30 674
20 자료 [Bootstrap] xeACE 레이아웃 3 title: 은메달도다 2017.09.17 632
19 자료 [Autohotkey] 매분 정각에 전체화면을 캡쳐하는 스크립트 4 file 이니스프리 2020.05.22 1100
Board Pagination Prev 1 2 3 4 Next
/ 4