하루에 5분씩만 투자해서 함께 공부해요~ 댓글은 개별 포스트 클릭하면 작성가능합니다~

HEIC 파일을 JPG와 PNG로 변환해주는 프로그램

  • 예전에 heic 파일 변환 관련한 코드를 이 블로그에 올린적이 있는데요.
  • 정작 실제로 사용할 일이 생기니까, 실행파일로 만들어야 편하겠더라구요. 그래서 만들어 봤습니다. 소스코드도 함께 공개할게요. 사용방법은 아래와 같습니다.
    • h2j.exe --input HEIC_파일이_있는_폴더 --output 저장할_폴더 --mode jpg|png
    • output을 생략하면 input 폴더와 같은 폴더에 저장됩니다.
    • 변경대상 파일형식은 jpg와 png로 구분하며, 생략하면 jpg로 저장됩니다.
  • 파일 다운로드
광고를 클릭해주시면 블로그운영에 큰 힘이 됩니다.
  • 코드는 아래와 같습니다.
import argparse

from PIL import Image
from pillow_heif import register_heif_opener
import os

def heic_to_jpg(input_folder, output_folder, ext):
    """
    HEIC 파일을 JPG 파일로 변환하는 함수

    Args:
      input_folder: HEIC 파일이 있는 폴더 경로
      output_folder: 변환된 JPG 파일을 저장할 폴더 경로
    """

    for root, _, files in os.walk(input_folder):
        for file in files:
            if file.endswith('.heic'):
                heic_path = os.path.join(root, file)
                jpg_path = os.path.join(output_folder, os.path.splitext(file)[0] + '.' + ext)

                try:
                    with Image.open(heic_path) as img:
                        if ext == "jpg":
                            img.save(jpg_path, 'JPEG')
                        elif ext == "png":
                            img.save(jpg_path, 'PNG')
                        print(f"Converted {heic_path} to {jpg_path}")
                except OSError as e:
                    print(f"Error converting {heic_path}: {e}")

parser = argparse.ArgumentParser()
parser.add_argument('--input', default='', help="input folder")
parser.add_argument('--output', default='', help="output folder")
parser.add_argument('--mode', default='jpg', help="output folder")
args = parser.parse_args()
register_heif_opener()
input_folder = args.input
output_folder = args.input if not args.output else args.output

if args.mode == "jpg" or args.mode == "png":
    heic_to_jpg(input_folder, output_folder, args.mode)

AWS API-GATEWAY에서 우리쪽 서버가 발생시킨 에러코드를 그대로 전달하는 방법

  • API-GATEWAY를 사용하다 보면 에러 응답 코드라던가, 응답 형식 등을 JSON으로 규정할 수 있음을 알 수 있습니다.
  • 이러다 보니까 우리가 사용하고 있는 에러 응답 코드들을 일일이 JSON으로 다 정의해서 올려야 하는건가? 하고 의구심이 들텐데요.
    • 안정적이고 다양한 확장 가능성이 있는 “좋은” 방법입니다만, “효율적”인 방법인지는 잘 모르겠네요.
    • 왜냐면 AWS가 제공하는 대시보드 전반의 불편한 UI 때문에, 이러한 JSON 입력도 상당히 까다롭기 때문입니다.
    • 저는 그래서 간단하게 PROXY만 제공하고 싶다면 아래와 같은 방법을 추천합니다.
  • 먼저 해당하는 메소드에서 통합요청탭의 편집 버튼을 클릭해주세요.
    • alt text
  • 그런다음 아래처럼 HTTP 프록시 통합을 체크하면 끝!
    • alt text

파이선에서 다른 가상환경을 이용하는 스크립트를 실행하기

  • 종종 다른 의존성 라이브러리를 사용하는 파이선 코드를 또 다른 파이선 코드 내부에서 실행해야 하는 경우가 있습니다.
  • 다음과 같은 상황을 가정해 봅시다.
    • a.py라는 파이선 프로그램은 conda activate a_config로 가상환경을 지정하고 실행했습니다.
    • 이때 conda activate b_config로 가상환경을 지정하고 실행해야 하는 b.py를, a.py 내부에서 실행시키고 싶습니다.
    • 어떻게 해야 할까요? 아래 코드를 참고하시면 됩니다.
  • 먼저 b.py를 실행시키는 쉘스크립트 b.sh를 만듭니다.
  • 경로는 사용하시는 값으로 지정하셔야 합니다! b.sh는 b.py가 있는 경로에 만들겠습니다.
#!/bin/bash
PATH=$PATH:${conda가 설치된 경로}/anaconda3/envs/b_config/bin
cd ${b.py가 존재하는 경로}
python b.py
  • 그리고 나서 a.py에서 아래처럼 b.sh를 실행해 주세요.
import subprocess

try:
    b_path = "b.py가 있는 경로"
    conda_path = "b_config가 설치된 경로"
    python_version = "b_config가 사용하는 파이선 버전 ex:python3.10"
    os.chdir(b_path)
    new_env = {
        "PATH": b_path,
        "PYTHONPATH": "%s/lib/%s/site-packages" % (conda_path python_version),
    }
    subprocess.run(["b.sh", 필요한 인자값들...], env=new_env)    
except Exception as e:
    print(e)
  • 인자값들이 필요하면 쉼표로 구분하면서 이어 넣으면 됩니다.