NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Python 인스타그램 업로드용 이미지에 내 로고 넣는 매크로 만들기. (Create a macro to put your logo on a…

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 여러분들도 인스타그램(Instagram) SNS를 하시는지는 모르겠지만~ 이미지를 편집하는 일은 단순 노가다성 작업입니다. 반복적인 단순 작업들은 매크로를 만들기가 그렇게 어렵지는 않습니다. 물론, 개발자에게 그렇다는 뜻입니다. 비개발자 또는 일반인이 아이디어는 있을지라도 이걸 프로그래밍으로 구현하기란 쉽지 않은 일입니다. 수백, 수천장의 이미지를 하나씩 처리하는건 비효율적인데요. 이걸 프로그램으로 어떻게 처리하는지 알아보도록 할께요. Visual Studio Code를 실행하세요. 그리고, insert_logo.py 파일을 하나 생성해줍니다. 이미지를 처리하고, 저장하기 위해 아래와 같은 패키지들이 필요합니다.

    import os
    from PIL import Image

     

    os 패키지는 윈도우 관련 함수들을 제공합니다. 이미지를 저장할 폴더를 만들거나 인스타그램 업로드용 이미지 파일에 로고를 추가하고, 저장할 폴더를 만듭니다. 원본 파일에 덮어쓰지 않아야겠죠?  Image 패키지는 이미지를 불러와서 편집하고 저장할 때 사용하는 패키지입니다. 파이썬은 수많은 패키지들을 제공해줍니다. 업무 또는 상황에 맞는 패키지들을 잘 사용하는게 핵심입니다. 아래와 같이 인스타그램에 업로드할 이미지가 들어있는 폴더를 설정하세요. 그리고, 이 이미지들에 추가할 로고 파일 위치도 변수로 선언 해줍니다.

    import os
    from PIL import Image
    
    # 사진이 저장된 폴더명 위치입니다.
    directory = "C:\Users\ngmas\Desktop\instagram"
    
    # 사진에 삽입할 로고 파일의 위치입니다.
    logo_filename = "C:\Users\ngmas\Desktop\logo.png"

     

    원본 이미지를 편집하지 않고, 로고가 추가된 새로운 이미지를 만들겁니다. 아래와 같이 로고가 추가된 이미지를 저장할 폴더를 만들어줍니다.

    # 결과물을 저장할 폴더를 생성합니다.
    out_dir ="C:\Users\ngmas\Desktop\instagram_result"
    if out_dir not in os.listdir():
        os.mkdir(out_dir)

     

    이미지 파일 목록을 input_files 변수에 저장하고 로고 파일도 불러옵니다. 그리고, 로고 파일의 크기를 logo_x, logo_y 변수에 각각 저장 해줬습니다. 이 변수들은 원본 이미지와 로고를 합칠 때 어떤 비율로 처리할지 계산할 때 사용됩니다. 이건 각각의 취향 부분이라서 적절하게 조정해주시면 좋을거 같네요.

    # 폴더의 내용물을 열람해 목록을 생성합니다.
    input_files = os.listdir(directory)
    
    # 로고 파일을 불러옵니다.
    logo = Image.open(logo_filename)
    logo_x, logo_y = logo.size

     

    인스타그램에 업로드할 이미지가 들어있는 폴더의 파일을 하나씩 순차적으로 처리해줍니다. 이런 순차적인 반복 처리는 for를 사용합니다. 혹시라도, 이미지가 아닌 파일이 폴더에 섞여 있는 경우가 있을 수 있습니다. 핸드폰으로 촬영하는 경우 이런일이 잘 없지만, 디지털 카메라를 사용하면 간혹, 리눅스용 임시 파일 또는 정보 파일들이 딸려오는 경우가 있습니다. 에러를 발생시킬만한 요소는 미리 제거 해줍니다.

    # input_files에 저장된 파일 이름을 하나씩 처리하기 위해 for 반복기를 사용했습니다.
    for filename in input_files:
        # 그럴일은 없겠지만~ 혹시라도 이미지 파일이 아닌것들이 포함되어 있는지 체크합니다.
        exp = filename.strip().split('.')[-1]
        if exp not in "JPG jpg JPEG jpeg PNG png BMP bmp":
            continue
    
        # 이미지를 불러옵니다.
        image = Image.open(directory + "/" + filename)
    
        # 이미지의 크기를 알아냅니다.
        Xdim, Ydim = image.size
    
        # 로고 파일을 이미지에 맞게 적당히 확대/축소합니다.
        if logo_x / Xdim > logo_y / Ydim:
            # 로고의 x축 길이를 이미지의 x축 길이의 1/5로 조절합니다.
            new_logo_x = int(Xdim/5)
            new_logo_y = int(logo_y * (new_logo_x / logo_x))
        else:
            new_logo_y = int(Ydim / 5)
            new_logo_x = int(logo_x * (new_logo_y / logo_y))
    
        # 이미지 크기에 맞게 축소/확대된 로고입니다.
        resized_logo = logo.resize((new_logo_x, new_logo_y))
    
        # 입력 받은 사진에 로고를 삽입합니다.
        # 여백을 2%정도 주었습니다.
        image.paste(resized_logo, (int(Xdim/50), int(Ydim/50)), resized_logo)
    
        # 변경된 이미지를 저장합니다.
        image.save(out_dir + "/" + filename)
    
        # 이미지를 닫아 줍니다. (이 부분을 빼먹으면 메모리 릭이 발생합니다.)
        image.close()

     

     

    파이썬 스크립트를 실행하고 결과를 확인 해보세요. 원본 폴더에는 아래와 같이 이미지가 들어 있습니다.

    J6IqkVl.png

     

     

    실행한 후 결과는 아래와같이 엔지엠소프트웨어 로고가 삽입된걸 확인할 수 있습니다.

    dIo2Ngw.png

     

     

    아래는 로고 파일입니다.

    iCwHfij.png

     

     

    간단하죠? 몇줄의 코딩으로 특정 폴더의 수많은 이미지를 간단하게 처리할 수 있습니다.

    XsKsbOw.png

     

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.