from PIL import Image, ImageSequence
import pillow_avif
image.save(image_path_out + '.avif', 'AVIF', save_all=True, speed=0, subsampling="4:2:0", quality=75)
이걸로 하면 알파 채널 있는 GIF를 AVIF로 변환할 때 알파 채널이 유지되지 않음
그래서
if "transparency" in image.info:
frames = []
for frame in ImageSequence.Iterator(image):
frame = frame.convert('RGBA')
frames.append(frame)
frames[0].save(image_path_out + '.avif', save_all=True, append_images=frames[1:], speed=0, subsampling="4:2:0", quality=75)
이렇게 해보니 알파채널이 유지됐는데 문제는 매우 빠르게 재생이 되는데
frames[0].save(image_path_out + '.avif', save_all=True, append_images=frames[1:], duration=image.info['duration'], speed=0, subsampling="4:2:0", quality=75)
이런 식으로 실행해보니 정상적으로 재생이 되는데
이렇게까지 해야되나? 의문심이 듬
왜냐하면 https://github.com/fdintino/pillow-avif-plugin/issues/14
이 링크에서 그냥 변환할 시 이미지 시퀀스 모드를 지원하지 않는 뷰어 또는 플레이어때문에 정상적인 재생이 되지않는다고 했고
그냥 변환한 후, html로 크롬에서 재생하면 정상적으로 재생된다는데
정작 크롬에서 매우 느리게 재생이 되고 그 외의 뷰어에서 재생하면 매우 빠르게 재생이 되는데
duration=image.info['duration']를 넣으면 크롬, 뷰어 둘 다 매우 부드럽게 정상적으로 재생이 됨
내가 잘못한건지 아닌지 잘 모르겠음
아무 옵션없이 변환시켜서 멀쩡한 결과물이 나오면 좋겠는데
정상적인 변환이 안되다보니 다른 라이브러리로 갈아타야하나들고
이미 다 고쳤다지만 뭔가 찝찝함이 크네
부터시작하는이세계생활
메모장으로 써야겠다.
JPG 그레이 스케일 모드인 경우 AVIF로 변환할 때 크로마 서브 샘플링 YUV400로 바꾸는 게 좋음
420로 변환하더라도 색상 정보가 없어 큰 영향을 주는 것은 아니지만 용량을 미세하게 줄일 수 있음
부터시작하는이세계생활
AVIF는 손실압축 알고리즘만을 사용하는 포맷으로 무손실은 엄연히 따지자면 무손실이 아니며
무손실 압축을 하고싶다면 WEBP의 무손실 압축 알고리즘을 사용하는게 좋다.
부터시작하는이세계생활
PNG의 팔레트(PAL7 또는 PAL8)가 알파채널을 보유하면 AVIF로 제대로 변환이 되지 않고 투명 배경이 초록색으로 표시되는 버그가 있음
if 'PNG' == image.format:
if image.mode == 'P':
if "transparency" in image.info:
image = image.convert('RGBA')
로 해결 볼 것