KurtBestor / Hitomi-Downloader

:cake: Desktop utility to download images/videos/music/text from various websites, and more.
21.2k stars 1.98k forks source link

건의) 픽시브 우고이라 확장자로 받을 수 있게 해주세요. #6986

Open wooeorbs opened 4 months ago

wooeorbs commented 4 months ago

webp 설정값에 따른 변환 용량 차이 (feat. jpg에서 webp로 변환할 때 이미지 용량 증가 이슈) https://velog.io/@effirin/webp-%EC%84%A4%EC%A0%95%EA%B0%92%EC%97%90-%EB%94%B0%EB%A5%B8-%EB%B3%80%ED%99%98-%EC%9A%A9%EB%9F%89-%EC%B0%A8%EC%9D%B4-feat.-jpg%EC%97%90%EC%84%9C-webp%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%A0-%EB%95%8C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%9A%A9%EB%9F%89-%EC%A6%9D%EA%B0%80-%EC%9D%B4%EC%8A%88

우고이라(ugoira)는 픽시브에서 주로 쓰는 JPG, PNG 포맷의 일러스트를 움직이는 확장자로 꿀뷰는 우고이라 확장자를 지원하므로 자체 확장자를 다운받을 수 있게 해야 합니다.

ZIP는 우고이라, GIF, WEBP(애니메이션)에 들어있던 프레임 시간, 템포 조절하는 부분을 없애므로 안좋으며 GIF는 무손실 압축 포맷이라 JPG(손실) 포맷의 우고이라를 변환할 때 무손실로 하기때문에 용량이 매우 커져서 안좋습니다. 또한 우고이라는 gif의 상위호환으로 GIF로 변환시키면 색깔 표현 문제가 있습니다.

WEBP는 손실과 무손실방식 둘다 갖고 있는 포맷이지만 jpg와 png 포맷을 인식해서 변환하는 기능을 추가하지않으면 쓰지 않는 게 좋습니다. (이미지 파일 확장자(image.open->image.format)를 읽는 기능이 있어야합니다.) 우고이라(ugoira)는 jpg, png를 둘다 쓰는 확장자이기 때문에 그렇습니다. 그리고 화질에서 100%으로 설정해도 손실압축으로 나오는 것으로 보아 손실압축방식이라고 표기해놔야 할듯 합니다. 지금까지 GIF를 WEBP로 변환시키는 줄 알고 100% 화질로 설정, 무손실 압축방식인줄 알고 썼는데 해골물 마셨던 기분입니다. 손실압축 100% 화질은 절대로 쓰면 안됩니다. 그런데 그걸 제가 썻던 셈이죠... 왜냐하면 JPG로 저장할 때 70, 80%로 손실압축하기떄문에 webp로 100% 손실압축하면 용량이 30% 늘어납니다. 그래서 webp 손실압축은 보통 70, 80%로 설정하는 데 그걸 쓰는 경우는 jpg, png 포맷일 때 쓰는데 우고이라도 그러하니 쓰면 좋은 것 같지만 문제는 PNG는 무손실 포맷이라 상황에 따라 손실 또는 무손실 압축방식으로 바꿔서 변환해야합니다. 그리고 픽시브에 올린 우고이라 확장자의 움짤은 대부분 이미지 사이즈가 작습니다. 즉 무손실 압축으로 하는게 좋습니다. 이미지 사이즈가 작은 움짤을 굳이 화질 훼손해가며 손실압축할 필요는 없습니다. 참고로 PNG를 webp로 손실압축 80% 화질 하면 약 84%, 무손실압축 하면 약 42%입니다

그렇기에 webp를 쓴다면 jpg는 손실압축 80%, png는 무손실압축 100%가 좋습니다. 포맷변환을 쓰는 경우는 용량최적화때문이니까요. 그러나 우고이라(ugoira)를 지원하는 꿀뷰가 있기때문에 원본 그대로 가지고 싶다면 용량최적화, 포맷변환을 쓸 필요없습니다.

wooeorbs commented 4 months ago

우고이라(ugoira) 파일을 연결 프로그램에서 ZIP로 열어보면 jpg 또는 png파일들과 animation.json 파일이 있습니다. animation.json가 자바스크립트로 로테이션, 프레임시간을 조절하는 부분입니다.

ZIP형식으로 다운 받는건 사실상 animation.json가 없는 우고이라와 똑같습니다.

참고 https://www.clien.net/service/board/lecture/14677378

만약에 우고이라를 webp로 변환시켜야한다면 우고이라 파일들을 webp 한 파일로 변환시킬 필요없이 jpg, png를 webp파일로 바꾸고, animation.json 메모장에 jpg, png 확장자를 webp로 바꿔넣으면 됩니다. 그러면 꿀뷰에서 알아서 자연스럽게 재생이 됩니다. 굳이 합치고 프레임 시간을 추가할 필요는 없습니다.

물론 한 파일로 합치면 용량을 더 줄여서 이득이긴하지만 webp로 저장하면 이미지와 애니메이션을 구분할 수 없다는 문제가 있습니다.

KurtBestor commented 4 months ago

.ugoira 파일 형식 규격이 어디에 명시되어있나요? 회전도 규격에 포함되어있나요?

wooeorbs commented 4 months ago

.ugoira 파일 형식 규격이 어디에 명시되어있나요? 회전도 규격에 포함되어있나요?

규격이 명시되어있는게 아닙니다. 우고이라는 공식 확장자가 아닙니다 우고이라는 픽시브에서 지원하는 애니메이션, 비공식 확장자입니다. 사용자가 여러개의 PNG 나 JPG 로 파일을 올리면 서버에서 자바스크립트로 로테이션해서 애니메이션을 보여줍니다. 그래서 픽시브 움짤을 추출할 때 자바스크립트를 animation.json로 추출해서 씁니다. Zip를 우고이라로 바꾸면 꿀뷰가 animation.json를 먼저 읽고 순서대로 이미지 파일, 프레임 시간을 읽어 재생합니다. 회전이 무슨 뜻인지 모르겠지만 꿀뷰로 재생하면 무한반복 됩니다.

animation.json 예시 {"src":"https://i.pximg.net/img-zip-ugoira/img/2018/09/18/03/16/21/70752726_ugoira1920x1080.zip","originalSrc":"https://i.pximg.net/img-zip-ugoira/img/2018/09/18/03/16/21/70752726_ugoira1920x1080.zip","mime_type":"image/jpeg","frames":[{"file":"000000.jpg","delay":1000},{"file":"000001.jpg","delay":120},{"file":"000002.jpg","delay":120},{"file":"000003.jpg","delay":120},{"file":"000004.jpg","delay":500},{"file":"000005.jpg","delay":120},{"file":"000006.jpg","delay":120},{"file":"000007.jpg","delay":50},{"file":"000008.jpg","delay":50},{"file":"000009.jpg","delay":50},{"file":"000010.jpg","delay":50},{"file":"000011.jpg","delay":50},{"file":"000012.jpg","delay":50},{"file":"000013.jpg","delay":50},{"file":"000014.jpg","delay":50},{"file":"000015.jpg","delay":50},{"file":"000016.jpg","delay":50},{"file":"000017.jpg","delay":50},{"file":"000018.jpg","delay":50},{"file":"000019.jpg","delay":50},{"file":"000020.jpg","delay":50},{"file":"000021.jpg","delay":50},{"file":"000022.jpg","delay":50},{"file":"000023.jpg","delay":160},{"file":"000024.jpg","delay":160},{"file":"000025.jpg","delay":160},{"file":"000026.jpg","delay":160},{"file":"000027.jpg","delay":160},{"file":"000028.jpg","delay":160},{"file":"000029.jpg","delay":160},{"file":"000030.jpg","delay":160}],"zipSize":5330173}

KurtBestor commented 4 months ago

꿀뷰에서 만든 포맷인 것 같네요: https://www.clien.net/service/board/lecture/14677378 정확한 규격이 어떻게 되는지는 모르겠지만 일단 만들어봤어요

테스트 부탁드려요: https://github.com/KurtBestor/Hitomi-Downloader/releases/tag/Technical-Preview

wooeorbs commented 4 months ago

다운 받고 꿀뷰로 켰을 때 재생이 잘 됩니다 받은 파일과 위의 예시로 들었던 animation.json와 비교해보면 [{"file":"000000.jpg","delay":1000},{"file":"000001.jpg","delay":120},{"file":"000002.jpg","delay":120},{"file":"000003.jpg","delay":120},{"file":"000004.jpg","delay":500},{"file":"000005.jpg","delay":120},{"file":"000006.jpg","delay":120},{"file":"000007.jpg","delay":50},{"file":"000008.jpg","delay":50},{"file":"000009.jpg","delay":50},{"file":"000010.jpg","delay":50},{"file":"000011.jpg","delay":50},{"file":"000012.jpg","delay":50},{"file":"000013.jpg","delay":50},{"file":"000014.jpg","delay":50},{"file":"000015.jpg","delay":50},{"file":"000016.jpg","delay":50},{"file":"000017.jpg","delay":50},{"file":"000018.jpg","delay":50},{"file":"000019.jpg","delay":50},{"file":"000020.jpg","delay":50},{"file":"000021.jpg","delay":50},{"file":"000022.jpg","delay":50},{"file":"000023.jpg","delay":160},{"file":"000024.jpg","delay":160},{"file":"000025.jpg","delay":160},{"file":"000026.jpg","delay":160},{"file":"000027.jpg","delay":160},{"file":"000028.jpg","delay":160},{"file":"000029.jpg","delay":160},{"file":"000030.jpg","delay":160}] 똑같이 frames의 부분만 가져온 걸 알 수 있습니다.

꿀뷰 버전 히스토리, 변경사항에서 (https://kr.bandisoft.com/honeyview/history/) 보시면

v5.34 2020/7/30 일부 Ugoira 파일을 열지 못하는 버그 수정 v5.33 2020/6/25 우고이라(.ugoira) 파일 처리 기능 개선 v5.11 2015/3/12 픽시브 우고이라 포맷 지원 기능 추가

이런 사항이 보입니다.

꿀뷰 게시판 https://groups.google.com/g/honeyview-win/search?q=Ugoira 에서 정확한건 아니지만 꿀뷰 규격이 어떻게 되어있는지 대략적으로 확인할 수 있습니다

wooeorbs commented 4 months ago

참고로 Zip, Ugoira 확장자의 썸네일 미리보기가 지원되지 않는 점은 Icaros 프로그램을 받아서 해결하면 됩니다 윈도우에서 공식적으로 jpg, png, gif, webp의 썸네일만 볼 수 있는데 Icaros 썸네일 탭에 ape;cb7;cbr;cbz;divx;epub;flac;flv;mk3d;mka;mkv;mpc;ofr;ofs;ogg;ogm;ogv;opus;rm;rmvb;spx;tak;tta;ugoira;wav;webm;wv;xvid;zip 를 붙여넣으면 썸네일을 볼 수 있습니다.

wooeorbs commented 4 months ago

여기서 더 향상된 기능을 보고자 한다면 위에 썻다시피 우고이라 내 파일들을 webp로 변환시키고 animation.json에 있는 jpg와 png 확장자를 webp로 바꾸는 것 입니다. 물론 jpg, png 포맷에 따라 jpg는 손실 70% 또는 80%, png는 무손실 100%로 webp 변환해야됩니다. 그리고 우고이라 확장자말고 webp 확장자로 보고싶을 때도 추가해야합니다.

히토미 다운로더에서 기본 포맷변환기능은 75%이지만 픽시브 우고이라를 webp로 변환할 때 기본값이 90%입니다. webp 이미지 파일은 구글에서 75%로 권장합니다 70-80%가 그래서 국룰인거죠. 그리고 위에 썻다시피 손실압축 100% 화질은 절대로 쓰면 안됩니다. JPG로 저장할 때 70, 80%로 손실압축하기떄문에 webp로 100% 손실압축하면 용량이 30% 늘어납니다.

히토미 다운로더 포맷 변환 기능에 화질 1 - 100%만 있고 jpg, png 포맷에 각각 맞춘 변환이 없고, 손실, 무손실 표시가 없어서 알 수가 없는데 개선이 필요해보이니 이 기능들만 추가해놓는다면 완벽한 기능, 더이상 추가할 필요없다고 생각합니다.

wooeorbs commented 4 months ago

히토미 다운로더는 우고이라를 받을 때 기본적으로 ZIP로 받고 서버 자바스크립트를 읽어서 여러 포맷으로 변환하는 방식인 것 같은데 우고이라는 ZIP안에 자바스크립트(프레임 시간) 넣은 압축포맷이니 별 의미없지만

webp 화질을 예로 들어보자면 webp 100% 화질로 받은 전체 파일 용량 3,149,055,484 바이트 우고이라 그대로 받은 전체 파일 용량 3,312,041,771 바이트 파일 개수는 690p로 용량은 크게 차이가 나지 않으며 실행해보면 로딩은 우고이라가 더 빠릅니다.

한 파일을 변환해본 결과 ZIP 또는 우고이라 파일 용량은 5,331,317 바이트 GIF로 변환 후 용량 6,190,387 바이트 우고이라 안의 파일을 webp 70%로 변환 후 용량 1,237,745 바이트 우고이라 안의 파일을 webp 80%로 변환 후 용량 1,973,209 바이트 히토미 다운로더로 webp 70%로 변환 후 용량 771,922 바이트 히토미 다운로더로 webp 80%로 변환 후 용량 1,103,854 바이트 히토미 다운로더로 webp 100%로 변환후 용량 3,732,906 바이트

참고로 픽시브 우고이라 안에 들어있는 JPG 파일들은 사용자가 화질을 어떻게 설정하느냐에 따라 달라지기 때문에 여기선 webp 100%로 설정했음에도 용량이 유의미하게 줄어들었습니다. jpg 손실압축 100%을 webp 손실압축 100%로 했을 때 용량 30%가 줄어들지만 jpg 손실압축 70%을 webp 손실압축 100%로 했을 때 용량 30%가 늘어납니다 JPG에 화질이 포함된 규격이 아니기때문에 webp로 변환할 때 참고할 수가 없어 보통 webp 70~80%로 합니다.

webp 100% 화질로 받은 전체 파일과 우고이라 그대로 받은 전체 파일의 용량이 크게 차이나지 않는 것만 봐도 알 수 있습니다. 만약에 jpg 손실압축 100%이였다면 유의미하게 30% 줄어드는데 전체 파일의 용량은 그렇지가 않습니다. jpg파일들이 제각각 60~100%로 저장돼있는 문제로 전체 파일의 용량이 줄거나 늘지 않은 경우가 된거죠