2014-04-09 2 views
4

UIImage가 UIImageJPEGRepresentation을 여러 번 통과 할 수있는 코드 조각을 디버깅 중이며 버그가 있어야하며 이미지 품질이 악화 될 것이라고 생각했지만 놀라 울 정도로 차이점을 시각적으로 확인하십시오.UIImage를 JPEG 이미지 데이터로 여러 번 압축하기

그래서 테스트를 수행하고 이미지를로드 한 다음 UIImageJPEGRepresentation을 1000 번 통과 시키려고했는데 놀랍게도 1 또는 1000 시간이 이미지 품질을 시각적으로 변화시키지 않았는지 그 이유는 무엇입니까?

는 테스트 코드입니다 :

 UIImage *image = [UIImage imageNamed:@"photo.jpeg"]; 

     // Create a data reference here for the for loop later 
     // First JPEG compression here 
     // I would imagine the data here already has low image quality 
     NSData *data = UIImageJPEGRepresentation(image, 0); 

     for(int i=0; i<1000; i++) 
     { 
      // Convert the data with low image quality to UIImage 
      UIImage *image = [UIImage imageWithData:data]; 

      // Compress the image into a low quality data again 
      // at this point i would imagine the image get even more low quality, like u resaved a jpeg twice in phootshop 
      data = UIImageJPEGRepresentation(image, 0); 
     } 

     // up to this point I would imagine the "data" has gone through JPEG compression 1000 times 
     // like you resave a jpeg as a jpeg in photoshop 1000 times, it should look like a piece of crap 
     UIImage *imageFinal = [UIImage imageWithData:data]; 
     UIImageView *view = [[UIImageView alloc] initWithImage:imageFinal]; 
     [self.view addSubview:view]; 

     // but it didn't, the final image looks like it has only gone through the jpeg compression once. 

편집 : 당신은 오브젝티브 -c에서이 작업을 수행 할 경우 내 의심의 여지가, 간단한 코드로 요약 될 수있다 :

 UIImage *image1 = an image.. 
     NSData *data1 = UIImageJPEGRepresentation(image1, 0); 
     UIImage *image2 = [UIImage imageWithData:data1]; 
     NSData *data2 = UIImageJPEGRepresentation(image2, 0); 
     UIImage *imageFinal = [UIImage imageWithData:data2]; 

는 imageFinal 두 번 JPEG 압축을 겪었나요 ?

+0

루프 값을 사용하지 않는 경우 루프의 요점은 무엇입니까? 네가 정말로하고 싶은 일이 혼란 스럽다. 값 0에 대해서는 내부의 다음 단계에서 데이터를 추가하지 않습니다. 더 설명해 주시겠습니까! –

+0

안녕하세요. 제 질문을 수정했습니다. 잘하면 지금은 분명합니다. – mkto

+0

NSLog (@ "% i", data.length)를 시도하는 것은 흥미로울 것입니다. 압축이 한계에 도달했는지 확인하십시오. – Roecrew

답변

2

아시겠지만 JPG 압축은 이미지를 변경하여 작은 파일 크기를 생성하여 작동합니다. 점진적으로 품질이 저하되지 않는 이유는 매번 동일한 압축 설정을 사용하기 때문입니다.

알고리즘은 원본 이미지를 압축 프로필에 맞게 조정합니다. 즉, 50 %의 JPG 결과를 50 %로 다시 압축하면 이미지를 변경할 필요가 없기 때문에 동일한 이미지가 생성됩니다. 더 이상.

Photoshop에서이를 테스트 할 수 있습니다. 사진을 30 % 품질의 JPG로 저장하십시오. 방금 저장 한 파일을 다시 열고 웹용으로 저장 - PNG (비 압축/원본)와 JPG 30 % 사이를 전환하십시오. - 아무런 차이가 없습니다.

희망이 도움이됩니다.

+1

오, 나는 그것을 몰랐다. 명확한 주셔서 감사합니다 :) – mkto

+0

"이 확장하려면이 문장을 압축 할 수 있습니다." this = 1 and en = 2 문장은 이제 "1을 확장하면 1 s2t2ce를 압축 할 수 있습니다." 압축 할 것이 없으므로 압축을 계속할 수 없습니다! 이미지 압축에도 동일하게 적용됩니다. – Roecrew

1

모든 유형의 압축은 이미지의 크기를 줄이는 데 이상적입니다. 이미지에 어떤 영향을 주는지 설명하는 두 가지 유형의 압축이 있습니다.

손실 압축 : 손실 압축은 일부 데이터를 제거하여 이미지 크기를 줄입니다. 일반적으로 이미지 품질에 영향을 주어 이미지 품질이 저하됩니다.

무손실 압축 : 무손실 압축은 데이터 저장 방법을 변경하여 이미지 크기를 줄입니다. 따라서 이러한 유형의 압축은 화질을 변경하지 않습니다.

사용중인 압축 유형을 확인하십시오.

+0

우리는 이것을 알고 있습니다. – Roecrew

0

이렇게하면 이미지 크기를 줄일 수 있습니다. 루프를 수행하고 싶은 횟수를 직접 입력하십시오.

UIImage *image = [UIImage imageNamed:@"photo.jpeg"]; 

for(int i=100; i>0; i--) 
{ 
    UIImage *image = [UIImage imageWithData:data]; 
    NSData *data = UIImageJPEGRepresentation(image, (0.1 * i); 
    NSLog(@"%d",data.length); 
} 
+0

나는 for 루프 예제가 많은 사람들을 여기 혼란스럽게한다고 생각한다.UIImageJPEGRepresentation이 여러 번 호출되는 경우 이미지를 여러 번 압축한다는 사실을 이해하고 싶습니다. 나는 이미지를 압축하기 위해 for 루프가 필요 없다. – mkto

+0

네,하지만이 코드를 구현하면됩니다. 나는 이것이 NSLog.NS에서 NSData 크기를 줄일 때마다 확인해 보았습니다. –

+0

그것이 당신을 위해 일하는가 아니면 더 노력해야합니까 ..? –

관련 문제