JPEG를 여러 번 다시 압축 할 때 "세대 손실"을 유발하거나 예방하는 요인은 무엇입니까?


29

몇 년 동안 JPEG 파일을 여러 번 다시 압축 하면 인식 할 수없는 혼란이 생길 ​​때까지 사진의 복사본을 만드는 방식과 같이 품질이 점차 저하 될 것이라고 믿었습니다 . JPEG는 손실 형식이므로 직관적으로 이해가됩니다. 다음과 같은 다른 Q & A도 있습니다.

그러나 동일한 품질 수준에서 JPEG를 다시 압축 해도 이미지 품질이 저하 되지않습니다 . 이것은 다른 곳에서 설명되는 점진적인 저하와 상반됩니다.

무슨 일이 기술적으로 JPEG가 재 압축하면 어떻게됩니까?  잃어버린 것은 무엇이고 어떻게? 이미지는 것 정말 텔레비전에 표시하는 데 사용되는 눈 덮인 엉망으로 변신? 여러 번 다시 압축 한 후 이미지가 분리되는 비디오는 어떻습니까?

(손상만으로 일반적인 손실 개념에 호소하지 마십시오.)

(이 질문과 지금까지 제기 된 답변 은 JPEG 파일을 여러 번 다시 압축 때 이미지 품질 저하를 유발하거나 방지 하는 기술적 요소 (특정 설정 및 이미지 조작) 에 중점을 둡니다 .)





2
@MonkeyZeus 품질 100에서 반올림 오류 로 인해 일부 (소량) 이미지 데이터가 손실됩니다 . 동일한 설정 (예 : 80)으로 다시 압축 해도 점진적인 데이터 손실이 발생 하지 않습니다 . 이것이이 Q & A가 다루고 자하는 "지식"입니다.
xiota 2016 년

1
@MonkeyZeus "100"및 "80"(또는 Photoshop에서 "10, 11, 12")과 같은 값은 임의적입니다. 100 %는 손실이 없습니다.
mattdm

답변:


32

이미지가 JPEG로 처음 압축 될 때 거의 모든 이미지 품질 손실이 발생합니다. 에 관계없이 JPEG가 재 압축 횟수의 동일한 설정으로 , 세대 손실은 오류를 반올림으로 제한됩니다.

  • MCU 경계는 그대로 유지됩니다 (8x8 블록).

  • 크로마 서브 샘플링이 비활성화되었습니다.

  • 일정한 DQT (동일한 품질 설정).

그러나 위의 기준에 맞지 않는 반복마다 반올림 오류가 커질 수 있으며 모든 원본 파일의 백업을 유지하는 것이 좋습니다.


JPEG 압축 알고리즘

  1. 색 공간을 변환합니다. 원하는 경우 색상 정보를 다운 샘플링 (크로마 서브 샘플링) (손실) 합니다. 다운 샘플링되지 않은 경우 정보 손실은 반올림 오류 의 결과입니다 .

  2. 분할. 각 채널을 8x8 블록으로 나누십시오 (MCU = 최소 코딩 단위). (무손실)

    참고 : 크로마 서브 샘플링이 활성화 된 경우 원래 이미지와 관련하여 MCU가 실제로 16x8, 8x16 또는 16x16 일 수 있습니다. 그러나 MCU는 여전히 8x8 블록입니다.

  3. 각 MCU의 이산 코사인 변환 (DCT). 정보 손실은 반올림 오류 의 결과입니다 .

  4. 정량화.  MCU의 각 셀의 값은 양자화 테이블 (DQT)에 지정된 숫자로 나뉩니다. 값은 반올림되며, 대부분 0이됩니다. 이것은 알고리즘의 주요 손실 부분입니다.

  5. 지그재그 스캔. 각 MCU의 값을 지그재그 패턴에 따라 일련의 숫자로 재 배열합니다. 양자화 중에 발생한 0은 함께 그룹화됩니다. (무손실)

  6. DPCM = 차동 펄스 코드 변조. 숫자 시퀀스를 압축하기 쉬운 형식으로 변환하십시오. (무손실)

  7. RLE = 실행 길이 인코딩. 연속적인 0이 압축됩니다. (무손실)

  8. 엔트로피 / 허프만 코딩. (무손실)

JPEG 재 압축

참고 색상 채널을 다운 샘플링 및 양자화하는 유일한 의도적으로 손실 단계는 . 현재 반올림 오류를 설정하면 다른 모든 단계는 손실이 없습니다. 양자화가 발생하면 단계를 반전하고 반복하면 동일한 결과가 나타납니다. 다시 말해, (동일한 DQT를 갖는) 재-양자화는 무손실 이다.

원칙적으로, 첫 번째 통과 후에 손실이없는 리샘플링 알고리즘을 생성 할 수 있습니다. 그러나 ImageMagick에서 구현하면 이미지에서 볼 수 있듯이 정상 상태에 도달하기 전에 색상이 크게 변할 수 있습니다.

최적의 조건이 주어지면 동일한 품질 설정으로 JPEG를 다시 압축하면 정확히 동일한 JPEG가됩니다. 다시 말해 JPEG 재 압축은 잠재적으로 무손실 입니다. 실제로 JPEG 재 압축은 손실이 없지만 반올림 오류의 영향을받으며 제한됩니다. 반올림 오류가 종종 0으로 수렴되기 때문에 동일한 이미지가 다시 만들어 지 더라도 채도 서브 샘플링으로 인해 색상이 크게 변경 될 수 있습니다.

데모 (동일한 품질 설정)

bashImageMagick을 사용하여 주어진 품질 설정에서 JPEG 파일을 반복적으로 다시 압축하는 다음 스크립트를 작성했습니다 .

#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg

while true ; do
   q2=${q1}            # for variants, such as adding randomness
   convert ${n}.jpg -quality ${q2} $((n+1)).jpg
   #\rm $((n-5)).jpg   # uncomment to avoid running out of space
   n=$((n+1))

   echo -n "$q2  "
   md5sum ${n}.jpg
done

몇 백 번 반복 md5sum하여 실행 한 결과를 얻었습니다.

d9c0d55ee5c8b5408f7e50f8ebc1010e  original.jpg

880db8f146db87d293def674c6845007  10316.jpg
880db8f146db87d293def674c6845007  10317.jpg
880db8f146db87d293def674c6845007  10318.jpg
880db8f146db87d293def674c6845007  10319.jpg
880db8f146db87d293def674c6845007  10320.jpg

실제로 반올림 오류가 0으로 수렴되었으며 동일한 이미지가 반복해서 재생되고 있음을 알 수 있습니다.

다른 이미지와 품질 설정으로 여러 번 반복했습니다. 일반적으로 정상 상태에 도달하고, 정확히 같은 이미지를 통해 재생 이상입니다.

무엇에 대해 @의 mattdm의 결과 ?

Ubuntu 18.04에서 Imagemagick을 사용하여 mattdm의 결과를 복제하려고 시도했습니다. 원본은 Rawtherapee에서 TIFF로 변환되지 않았지만 더 이상 사용할 수없는 것 같습니다. 대신, 확대 버전을 가져 와서 원래 크기 (256x256)로 줄였습니다. 그런 다음 수렴을 얻을 때까지 75에서 반복해서 다시 압축했습니다. 결과는 다음과 같습니다 (원본, 1, n, 차이).

mattdm 복제 시도

결과가 다릅니다. 진정한 원본이 없으면 차이의 이유를 판단 할 수 없습니다.

무엇에 대한 THS의 몽타주 @ ?

몽타주 왼쪽 상단에서 90으로 수렴 할 때까지 이미지를 다시 압축했습니다. 결과는 다음과 같습니다 (원본, 1, n, 차이).

몽타주 복제 시도

크로마 서브 샘플링을 활성화 한 후에는 색상 정상 상태에 도달 하면 색상이 변경 됩니다.

색 변경

적은 수의 설정 중에서 변경

변수를 수정하면 q2품질 설정을 균일하게 분포 된 값 세트로 제한 할 수 있습니다.

q2=$(( (RANDOM % 3)*5  + 70 ))

A에 대한 설정 선택의 소수 평형 결국 도달 할 수 있는 md5 값이 반복 시작할 때 볼 수있는. 평형에 도달하기 전에 세트가 클수록 더 오래 걸리고 이미지가 더 나빠집니다.

평형에서 일어나는 것처럼 보이는 것은 양자화 전의 DCT 계수는 양자 값의 전부 (또는 대부분)로 나눌 수 있어야한다는 것입니다. 예를 들어 DCT 계수를 3과 5로 교대로 나누는 두 DQT 간을 전환하면 DCT 계수를 15로 나눌 수있을 때 평형에 도달하게됩니다. 이는 품질 저하가 원래 설정 간의 차이보다 훨씬 큰 이유를 설명합니다.

더 많은 수의 설정 중에서 변경

Eeyore는 q2다음과 같이 변경 되면 행복하지 않습니다 .

q2=$(( (RANDOM % 9)  + 90 ))

비디오를 만들려면 다음을 사용하십시오 ffmpeg.

rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4

보고 처음 9999 반복하는 것은 거의 물 종기를 보는 것과 같다. 재생 속도를 두 배로 늘리고 싶을 수도 있습니다. 11999 년 반복 후 Eeyore는 다음과 같습니다.

11999 반복, 임의의 DQT

MCU 경계가 변경되면 어떻게됩니까?

변경 횟수가 제한된 경우 반복해서 다시 압축하면 정상 상태에 도달 할 수 있습니다. 반복 할 때마다 변경이 발생하면 DQT가 변경 될 때와 비슷한 방식으로 이미지가 저하 될 수 있습니다.

편집은 어떻습니까?

편집 후 재 압축의 효과는 수행 된 특정 편집에 따라 다릅니다. 예를 들어 JPEG 아티팩트를 줄인 후 동일한 품질 설정으로 저장하면 동일한 아티팩트가 다시 도입됩니다. 그러나 치유 브러시와 같은 현지화 된 변경을 적용해도 손대지 않은 영역에는 영향을 미치지 않습니다.

지정된 품질 설정에서 파일을 처음 압축하면 이미지 품질이 가장 떨어집니다. 동일한 설정으로 다시 압축하면 반올림 오류보다 큰 변화가 발생하지 않아야합니다. 따라서 MCU 경계가 그대로 유지되고 채도 서브 샘플링이 비활성화되어 있으면 동일한 품질 설정으로 저장된 다른 이미지와 같이 주어진 품질 설정에서 편집 복원주기가 예상됩니다 .

그 비디오는 어때?

  • JPEG 구현에 문제가 있습니까? ( 10/12에 Photoshop으로 500 번 다시 저장 )

  • 품질 설정 변경 (대부분의 비디오)

  • MCU 경계를 방해합니다. (자르기 또는 회전 )

  • 이미지 품질을 낮추거나 JPEG 알고리즘을 방해하는 다른 방법은 무엇입니까?

재 압축 JPEG로 원본을 덮어 쓸 수 있습니까?

모든 원본 파일의 백업을 유지하는 것이 신중 하지만 실수로 파일을 덮어 쓰면 손상이 제한 될 수 있습니다. 크로마 서브 샘플링이 비활성화 된 JPEG에서 작동하는 것도 좋습니다.

색상 당 8 비트를 초과하는 이미지에는 JPEG를 사용할 수 없습니다.


5
그러나 그림은 load- edit -save 루프 와는 상당히 다릅니다 . 이 경우, 양자화가 반복되면 성능이 저하됩니다.
th

2
방금 답변과 동일한 스크립트로 테스트했습니다. 다음은 20 번째 이미지마다 tp 100의 몽타주입니다. i.stack.imgur.com/xtob6.jpg 중요합니다.
th

2
아 내 이미지에서 문제를 발견했습니다. 크로마 서브 샘플링이 켜져 있으면 점진적으로 저하됩니다.
th

2
그것도 찾았습니다. 따라서 크로마 서브 샘플링을 활성화하면 정상 상태에 도달하기 전에 이미지의 색상이 크게 변경됩니다.
xiota

2
동일한 반올림 매개 변수를 사용하여 반복 된로드 및 저장을 수행하면 무한한 품질 손실이 발생하지 않을 수 있습니다. 대부분의 입력 파일을 추가 반올림 오류없이로드하고 다시 저장할 수 있고 반올림 오류의 영향을받는 파일이 발생할 수 있기 때문입니다. 그렇지 않은 파일. 반면, 비슷하지만 동일하지 않은 압축 매개 변수를 번갈아 반복하여로드 / 저장주기를 반복하면 모든주기에서 반올림 오류가 발생할 수 있습니다.
supercat

20

재 압축 손실은 특히 높은 수준의 JPEG 압축으로 작업 할 때 실제로 발생합니다.

당신은 동일한 매개 변수를 사용하여 JPEG 파일 저장 - 다시 경우 이론적으로, 그리고 8 × 8 개 블록에 당신의 작물을 정렬 한 저하는 해야한다 최소화. 그러나 높은 수준의 압축을 사용하는 경우 초기 압축으로 인해 생성 된 아티팩트 가 이미지를 영구적으로 변경하고 다시 압축하여 더 많은 아티팩트를 유발 하므로 추가 손실 이 발생합니다.

낮은 압축 수준으로 다시 저장하면 (Gimp의 "100"또는 Photoshop의 11 또는 12와 같은 고품질) 새로 추가 된 아티팩트를 알아 채기가 어렵습니다. 이미지를 더 좋게 만들지는 않지만 크게 나쁘지는 않습니다. 그러나 전체 이미지에서 변경 사항 도입됩니다.

빠른 테스트로 ImageMagick을 사용하여 JPEG 이미지를 75 % 이상 반복해서 다시 압축했습니다. 아래 샘플은 다시 압축을 피하기 위해 PNG 파일로 업로드되었으며 PNG로 변환 할 때 크기가 두 배로 증가하여 효과가 더욱 분명해졌습니다. (테스트에 사용 된 원본은 두 배가되지 않았습니다.) 8 개의 리샘플링 후 효과가 완벽하게 안정적인 결과로 수렴되었으며 다시 압축하면 비트 단위의 동일한 파일이 생성됩니다.

압축되지 않은 원본은 다음과 같습니다.

원본, JPEG 압축 없음

JPEG가 75 %가 된 결과는 다음과 같습니다.

첫 JPEG

그리고 그것은 저축 된 것입니다 :

두 번째 패스

이 1 초 저장은 많은 추가 성능 저하를 유발합니다!

최종 수렴 된 이미지는 다음과 같습니다 (8 번째 패스).

수렴 jpeg

다시 말하지만, 일부 잘못된 색상 패턴을 포함하여 색상이 훨씬 더 떨어져 있으며 블록 모양의 인공물이 더 많이 나옵니다. 알고리즘이 수렴되지만 크게 성능이 저하 된 버전이됩니다. 그러니 그렇게하지 마십시오.

그러나 9 패스 후에 99 % 품질 수준을 가진 동일한 내용이 있습니다 (추가 패스가 수렴되는 지점은 동일합니다).

99 % 9 배

여기서 차이는 거의 기록되지 않습니다. (말 그대로, 압축되지 않은 버전과 픽셀 단위로 비교하면 편차는 아주 작은 랜덤 노이즈입니다.) 따라서 처음 75 % 이미지로 돌아가서 99 %로 다시 저장하면 어떻게됩니까? 음, 이것은 (한 번만) :

한 번 75 %, 한 번 99 %

놀랍게도 같은 매개 변수로 다시 저장하는 것보다 고품질로 저장하는 것이 눈에 띄게 좋습니다. 그러나 분홍색 트리밍과 눈 주위에는 분명 새로운 저하가 있습니다. 동일한 설정의 재활용 버전을 사용하면 재 압축 할 때마다 JPEG 아티팩트가 과장됩니다. 내가 선택한 저해상도와 품질이 낮 으면 모든 것을 다르게 압축하는 것보다 나빠집니다.

그 비디오에서 : 나는 이것을 최고의 Google 히트작으로 찾았 습니다. 설명에 나와 있습니다.

무작위 고품질 설정 (85 이상) 으로 JPEG 이미지를 여러 번 다시 인코딩하면 이런 일이 발생합니다 .

강조 추가 -동일한 설정으로 저장하거나 초 고품질로 저장하는 대신 매번 무작위 설정이 사용 되기 때문에 수렴이없는 이유를 설명합니다 .

내가 찾은 두 번째 비디오는 말한다 :

JPEG 이미지가 복사되어 각 이미지마다 완전히 회전되었습니다. [...] (596 "시계 방향으로 회전"동작)

다시, 오류가 누적되도록 무언가를 수행했습니다.

어쨌든 실제 사진 편집 을 위해서는 75 %를 한 번 저장 하는 것이 백만 번 99 %를 다시 저장하는 것보다 훨씬 나쁘다는 점을 언급 할 가치가 있습니다. 필자의 사례에서는 75 %의 인공물이 너무 명백하여 추가 분해가 바다에 물을 버리는 것과 같습니다. 이러한 아티팩트가 실제로 보이지 않을 정도로 높은 수준으로 저장하면 원래 설정으로 다시 저장하는 것이 좋습니다. 물론, 항상 압축되지 않은 원본으로 작업 할 수 있다면 더 좋습니다.

어떤 이유로 든 JPEG로 작업해야하는 경우 (또는 강력하게 선호하는 경우) 초기 파일의 차이가 눈에 띄지 않더라도 카메라를 가능한 최고 품질로 저장 하십시오. Pentax의 프리미엄 JPEG 품질 설정을 사용할 가치가 있습니까?를 참조하십시오 . 이에 대한 자세한 내용은 실제로 펜탁스에만 한정되는 것은 아닙니다.


(1) 75 % 절약하고 있습니다. 이 설정에서 이미지 품질 손실이 예상됩니다. (2) JPEG 압축 아티팩트를 과장하기 위해 해당 이미지가 선택되고 변경되었습니다. (3) 8 회의 재 압축 후 이미지가 수렴 된 후 이미지 품질이 더 이상 저하되지 않습니다. (4) "발전 손실"을 보여주는 이미지의 비디오는 처음 1/4 초 후에는 아무 것도 일어나지 않을 것입니다.
xiota

5
(1) 예. (2) 이런 종류의 일을 걱정할 수있는 전형적인 사진으로 "선택". "변경됨"만 확대합니다. 이것은 여기 에 표시 하기위한 것 입니다. 작업 한 이미지의 크기를 두 배로 늘리지 않았습니다. (3) 그렇습니다. 그러나 실제로 편집 할 때는 관심을 가질만한 첫 몇 라운드입니다. (4) 그것은 사실이지만 최악의 경우로 수렴하고 머무르는 것이 어떤 식 으로든 유용하다는 것을 암시하지는 않습니다.
mattdm

복제하려면 첫 번째 이미지를 가져 와서 리샘플링이나 보간없이 256x256으로 크기를 조정하십시오.
mattdm

나는 당신이 보여주는 이미지들 사이에 많은 차이를 수 없습니다 . 나는 단독 - 재 압축과 mutliply - 재 압축 이미지의 차이를 가지고 그것을 볼 수 있도록 그것을 증폭하지만,이 (훨씬 더 설득력) 결과를 얻을 : i.stack.imgur.com/57uaY.png이 (내 삭제 참조 사람들이 미세한 차이를 감지하기 위해 이미지를 계속 쳐다볼 필요가 없기 때문에 더욱 확실합니다.
Szabolcs 2016 년

그 차이는 매우 작습니다. LCD 화면이 큰 경우 시야각이 약간 다른 결과로 나오는 "감마"가 다르면 아티팩트가 더 두드러지게 나타날 수 있습니다.
xiota 2018 년

5

재 압축은 이미지 품질에 상당한 영향을 미치며 압축률을 변경할 때 그 효과가 훨씬 더 두드러집니다.

여기서는 라인 피처와 연속 피처의 조합을 포함하는 테스트 이미지에서 수행되는 작업에 대한 일부 SSIM 값 으로 빠르게 확인 합니다. 나는 그것이 JPG95를 선택한 이유는 그것이 Ad-photo school과 JPG83에서 사용하도록 가르쳐 졌기 때문입니다. 그것이 디지털 컨텐츠 제공자들 사이에서 일반적이기 때문입니다.

  • Tiff 이미지를 JPG95-.9989로 저장
  • Tiff 이미지를 JPG83-.9929로 저장
  • JPG95 이미지를 JPG95로 10 회 다시 저장-.9998
  • JPG83 이미지를 JPG83으로 10 회 다시 저장-.9993
  • JPG95를 JPG83로 다시 저장 한 다음 JPG95로 다시 저장-.9929
  • JPG95를 JPG83, JP83-JP92, JPG92-JPG86-.9914로 다시 저장

따라서 동일한 압축에서 10 번 다시 절약 할 때 손실되는 구조적 유사성의 양은 딱딱함에서 품질로 절약 할 때 손실되는 것의 1/10입니다. 그러나 JPG 압축 변경으로 인한 품질 손실은 이미지를 Tiff에서 JPG로 저장할 때 손실되는 품질과 같습니다.

이 테스트를 몇 가지 더 실행하고 업데이트하겠습니다.

방법론 : ImageJ에서 :

  1. Tiff RGB를 회색조 8 비트로 변환
  2. Tiff Original에서 JPG95 및 JPG83 저장
  3. 지정된대로 추가 재 저장 작업 수행
  4. 비교 이미지로드 및 SSIM 인덱스 플러그인 사용

참고 : SSIM 값을 처음 보는 많은 사람들이이를 백분율로 읽고 차이가 작다고 가정합니다. 반드시 그런 것은 아닙니다. SSIM 값은 1의 분산으로 간주되지 않고 서로에 대해 비교되어야합니다.


@ xiota, ImageJ에 SSIM 플러그인을 사용하고 있습니다. 매개 변수를 조정할 수있는 몇 가지 SSIM 구현 중 하나입니다 (16px JPEG 블록 내에서 변화를 감지 할 수 있도록 필터 너비를 8로 설정했습니다). 에너지 차이에 더 민감하기 때문에 SSIM을 선호합니다. 복구. 차이가 상쇄되거나 차이가 작은 영역에 집중되면 차이 이미지가 잘못 될 수 있습니다.
PhotoScientist 2016 년

그리고 두 번째 질문에 따르면 JPG95에서 JPG83으로, JPG95 로의 차이는 Tiff에서 JPG83으로가는 것과 같습니다. Tiff-JPG95-JPG83-JPG95를 원한다면 .9923입니다.
PhotoScientist

네 가지 압축으로 시도를 추가했습니다. 손실은 여전히 ​​크지 만 여러 다른 압축을 시도 할 때 동일한 압축의 여러 세대에 걸쳐 나타나는 "수렴"도 존재합니다. 여전히 앱 중심 워크 플로에서 시도하고 싶지만 약간의 레거시가 필요합니다.
PhotoScientist

또 다른 문제는 SSIM 임계 값에 대한 "품질"설정의 표준 매핑이 없으며, 중요한 정보 손실을 피하기 위해 어떤 품질 설정이 필요한지 결정할 방법이 없다는 것입니다. JPEG를로드하여 충분히 높은 설정으로 저장하면 추가 품질 손실을 피할 수 있지만 파일이 커질 수 있습니다. 파일을 만들 때 어떤 설정을 사용했는지 모르는 경우 파일을 다시 저장할 때 사용할 설정을 결정하기 어려울 수 있습니다.
supercat

4

실험과 같은 것은 없습니다. 다음 bash 스크립트 (Linux에서 작성되었으며 ImageMagick 이있는 경우 OSX에서 작동 할 수 있음 ) :

  • 첫 번째 이미지로 시작 ( step000.jpg)
  • JPEG 파일을 가져 와서 새 이미지임을 증명하기 위해 흰색 점을 추가하고 (무손실 PNG)로 저장
  • PNG를 가져와 JPEG로 다시 압축합니다. 따라서 JPEG를 JPEG로 압축하지 않으며 소프트웨어가 인코딩 된 블록을 복사한다고 가정 할 수 없습니다.
  • 두 JPEG 사이의 다른 픽셀을 보여주는 이미지를 만듭니다.
  • 이전 단계의 출력 JPG를 사용하여 헹굼 및 반복

결과는 다음과 같습니다.

  1. 높은 JPG 품질에서 많은 손실이 없습니다.
  2. 반올림 오류는 결국 몇 세대가 지나면 더 이상 저하되지 않습니다.

물론이 모든 것은 JPEG가 매번 동일한 매개 변수를 가진 동일한 소프트웨어에 의해 저장된다고 가정합니다.

#! /bin/bash
# Runs successive JPEG saves on an image to evaluate JPEG losses

# convert & compare command from imagemagick
# if you use a recent version of IM, set these variables to:
# compare="magick compare"
# convert="magick convert"
convert=convert
compare=compare

dotradius=2
defaultsteps=10
defaultquality=90 # default quality for "convert"

function usage {
        echo "Usage: $0 [quality [steps]]"
        echo ""
        echo "Where:"
        echo "       - 'quality' is the quality factor of the JPEG compression "
        echo "          (1-100, 100 is best, default is $defaultquality)"
        echo "       - 'steps' is the number of successive steps to perform"
        echo "         (default is $defaultsteps)"
        echo ""
        echo "Produces:"
        echo "   - successive saves of a JPEG image to test JPEG-induced losses."
        echo "   - compare images with the original file and the 1st JPEG save."
        echo ""
        echo "Starts from a 'step000.jpg' file in the current directory."
        exit 1
}

[[ -n "$3" ]] && { usage ; exit 1 ; }
steps=${1:-$defaultsteps}
quality=${2:-$defaultquality}    
dotcolor="white" # change this if the top of the image is too clear

echo "Running with $steps steps with quality $quality"

for step in $(seq $steps)
do 
    echo "Step $step of $steps"
    src=$(printf step%03d $(( $step - 1 )) ) 
    dst=$(printf step%03d $(( $step )) )
    dif=$(printf diff%03d $(( $step )) )
    # dot coordinates
    let cxc="2 * $dotradius * $step"
    let cxr="$cxc + $dotradius"
    let cyc="$dotradius * 2"
    let cyr="$dotsradius * 2"

    $convert $src.jpg -fill white -draw "circle $cxc,$cyc,$cxr,$cyr" $dst.png
    $convert $dst.png -quality $quality $dst.jpg
    rm $dst.png
    $compare $src.jpg $dst.jpg $dif.jpg
done

당분간 나는 결과를 보여주지 않을 것이다. 나는 당신이 당신의 자신의 그림으로 실험하게하는 것을 선호한다. 의견이 충분하면 샘플을 추가하겠습니다.


1
다른 소프트웨어에 대해 궁금했습니다. 7 가지 소프트웨어에서 7x를 저장하려고했습니다. 차이가 상당히 커서 각 응용 프로그램의 손실이 같은지 확인했습니다. 앱 중 1 개가 모든 변형을 담당했습니다. 빨간 청어를 제거하면 6x 프로그램에서 6x 저장은 ImageJ에서 6x 저장과 동일합니다
PhotoScientist

잘못 코딩 된 소프트웨어가있을 수 있습니다. 다양한 앱의 알고리즘을 혼합하면 반올림 오류도 해결되지 않을 수도 있습니다.
xenoid

@xiota, FLEMinimizer라는 이상한 작은 프로그램이었습니다. 왜 내가 처음에 그것을 가지고 있었는지조차 기억조차하지 않습니다. 나머지는 ImageJ, Matlab, Photoshop, FastStone Image Viewer, Ifranview 및 CameraRaw입니다. 이 6 가지 단계 사이에는 거의 차이가 없었습니다.
PhotoScientist 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.