공부한거 잊었을 때 보려고 만든 블로그

파이썬 이미지 압축하기 본문

자유 주제

파이썬 이미지 압축하기

Parcon 2023. 4. 12. 00:33
import cv2
import numpy as np

def opencv_img_save(img, save_img_path, save_img_name):
    # img 압축할 이미지
    # save_img_path 저장할 파일 경로
    # save_img_name 저장할 파일 이름

    img = compress_img(img)
    cv2.imwrite(save_img_path + save_img_name, img,[int(cv2.IMWRITE_JPEG_QUALITY), jpeg_quality])

def compress_img(img):

  # 이미지 최대 사이즈 1MB
  MAX_SIZE = 1000000

  # JPEG 압축 수준 설정
  jpeg_quality = 90

  # 압축된 이미지 용량 확인
  img_size = MAX_SIZE + 1
  last_size = 0

  # 압축률을 조절하여 이미지 용량이 1MB 미만이 될 때 까지 반복
  while img_size > MAX_SIZE:
      img_encode = cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), jpeg_quality])
      img_size = img_encode[1].size

      # 더 이상 압축이 안될 때 탈출한다. 10번쯤 반복하여 jpeg_quality가 0이 되면 압축해도 용량이 그대로가 됨
      if last_size == img_size:
        break

      last_size = img_size
      jpeg_quality -= 10
      
  # 인코딩 결과를 넘파이 배열로 변환
  encimg = np.array(img_encode[1])

  # 넘파이 배열을 다시 디코딩하여 이미지로 변환
  decimg = cv2.imdecode(encimg, 1)

  return decimg