2013-01-19 9 views
11

Kiedy używam UIImagePNGRepresentation lub UIImageJPEGRepresentation do konwersji UIImage do NSData, rozmiar obrazu jest zbyt dużo wzrosły.Kiedy używam UIImagePNGRepresentation lub UIImageJPEGRepresentation do konwersji UIImage do NSData, rozmiar obrazu jest zbyt dużo wzrosła

Kroki prowadzące do odtworzenia:

1) Otwórz Xcode i wybierz nowy projekt jako aplikacji opartej pojedynczy widok

2) Otwarte ViewController.xib i dodać dwa przyciski o nazwach jak ja) image Test Online ii) test obraz lokalny

3) Dodaj dwa IBActions

i) -(IBAction)ClickLocalImageTest:(id)sender; 

    ii) -(IBAction)ClickOnLineImageTest:(id)sender; 

4) Podłączyć "obraz test online" na "-(IBAction)ClickOnLineImageTest:(id)sender"

i "Przetestuj obraz lokalny" na "-(IBAction)ClickLocalImageTest:(id)sender;"

5) Impalement "-(IBAction)ClickLocalImageTest:(id)sender" metoda jak w następujący sposób

- (IBAction)ClickLocalImageTest:(id)sender { 
    NSLog(@"*************Test Local Image****************\n"); 
    NSString *path=[[NSBundle mainBundle] pathForResource:@"hero_ipad_retina" ofType:@"jpg"]; 
    NSLog(@"Before testing image size is :<---- %u kb",[[NSData dataWithContentsOfFile:path] length]/1024); 
    UIImage *img = [UIImage imageNamed:@"hero_ipad_retina.jpg"]; 
    NSLog(@"UIImagePNGRepresentation: image size is---->: %u kb",[UIImagePNGRepresentation(img) length]/1024); 
    NSLog(@"UIImageJPEGRepresentation with scale 1.0: image size is---->: %u kb \n",[UIImageJPEGRepresentation(img, 1.0) length]/1024); 
    NSLog(@"*************Completed test****************\n\n\n\n"); 
} 

6) Impalement "- (IBAction)ClickOnLineImageTest:(id)sender" Sposób następujące

- (IBAction)ClickOnLineImageTest:(id)sender { 
    NSLog(@"*************Test Online Image****************\n"); 
NSLog(@"Before testing image size is :<---- %u kb",[[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://images.apple.com/home/images/hero_ipad_retina.jpg"]] length]/1024); 
UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://images.apple.com/home/images/hero_ipad_retina.jpg"]]]; 
NSLog(@"UIImagePNGRepresentation: image size is---->: %u kb",[UIImagePNGRepresentation(img) length]/1024); 
NSLog(@"UIImageJPEGRepresentation with scale 1.0: image size is---->: %u kb \n",[UIImageJPEGRepresentation(img, 1.0) length]/1024); 
NSLog(@"*************Completed test****************\n\n\n\n"); 
} 

7) Proszę pobrać "hero_ipad_retina.jpg" obraz z here i zapisz w swoich zasobach o nazwie "hero_ipad_retina.jpg"

7) Teraz uruchom ten projekt na Xcode 4 0,0 później i IOS3.0 powyżej SDK

**

Expected Results: 
1)Click on "Test Online Image" button result should be as following 
*************Test Online Image**************** 
Before testing image size is :<---- 78 kb 
UIImagePNGRepresentation: image size is---->: 78 kb 
UIImageJPEGRepresentation with scale 1.0: image size is---->: 78 kb 
*************Completed test**************** 
2)1)Click on "Test Local image" button result should be as following 
*************Test Local Image**************** 
Before testing image size is :<---- 78 kb 
UIImagePNGRepresentation: image size is---->: 78 kb 
UIImageJPEGRepresentation with scale 1.0: image size is---->: 78 kb 
*************Completed test**************** 
Actual Results: 
1)Click on "Test Online Image" button result should be as following 
*************Test Online Image**************** 
Before testing image size is :<---- 78 kb 
UIImagePNGRepresentation: image size is---->: 480 kb 
UIImageJPEGRepresentation with scale 1.0: image size is---->: 180 kb 
*************Completed test**************** 
2)1)Click on "Test Local image" button result should be as following 
*************Test Local Image**************** 
Before testing image size is :<---- 78 kb 
UIImagePNGRepresentation: image size is---->: 480 kb 
UIImageJPEGRepresentation with scale 1.0: image size is---->: 180 kb 
*************Completed test****************** 

Moje pytanie:

dlaczego jest zwiększenie jej rozmiaru? i jaki jest zoptymalizowany sposób konwersji obrazu na NSData?

Uwagi: pobierz "hero_ipad_retina.jpg" obraz z here i zapisać w zasobach

+1

Wow. Pierwsze pytanie, które przeczytałem, wygląda jak radar jabłkowy ... Nie jestem pewien, co o tym myślę. – CodaFi

+0

Powtórzyłeś dwukrotnie swój test lokalnego obrazu ... – foundry

+0

dziękuję, zredagowałem moje pytanie –

Odpowiedz

8

"hero_ipad_retina.jpg" jest skompresowany jpg obraz

Linia:

[[NSData dataWithContentsOfFile:path] length]/1024 

podaje skompresowany rozmiar pliku ...

Ta linia:

[UIImagePNGRepresentation(img) length]/1024 

dekompresuje obraz i konwertuje go do PNG, który jest bezstratnego formatu plików. Jego rozmiar jest nieuchronnie znacznie większy.

Linia:

[UIImageJPEGRepresentation(img, 1.0) length]/1024 

dekompresuje obraz i kompresowane go do reprezentacji JPG. Ustawiłeś jakość na maksimum (1.0), więc - w porównaniu z oryginałem, który bez wątpienia został skompresowany do niższej jakości - otrzymujesz większy rozmiar pliku. Jeśli ustawisz jakość na 0.5, otrzymasz mały rozmiar pliku (około 42K).

To jest świetne przypomnienie, dlaczego należy ostrożnie traktować obrazy jpeg. Za każdym razem, gdy uzyskujesz dostęp do jpeg imageRep, dekompresujesz. Jeśli następnie ponownie skompresujesz - nawet przy pełnej jakości - obniżasz jakość obrazu (ponieważ każdy kompres stratny jest gorszy niż poprzedni). Artefakty zwiększają się i stają się szczególnie zauważalne w przypadku obrazów graficznych (płaskie kolory, proste/kontrastujące krawędzie). PNG jest zawsze bezpieczniejszy - jest bezstratny na poziomie 24-bitowym, a na 8-bitowym dobrze radzi sobie z obszarami o płaskim kolorze.

aktualizacja

Aby uzyskać rozmiar obrazu w pamięci:

NSUInteger sizeInBytes = 
    CGImageGetHeight(image.CGImage) * CGImageGetBytesPerRow(image.CGImage); 

Od tego można wypracować współczynników kompresji dla PNG, JPG i oryginalnego pliku (podzielić przez 1024 dla kilobajtów, aby uzyskać prawidłowe proporcje z powyższymi danymi).

+0

Nawet czytałem z lokalnej lub online różnicy w rozmiarze może być mniej niż 20 do 30%. Ale w przypadku tutaj jest to więcej niż 300%? –

+0

@HelpMeToHelpYou Tego można się spodziewać. Właśnie dlatego jpeg jest używany online - zmniejsza rozmiary plików nawet o 10 lub nawet więcej (wszystko zależy od ustawień jakości). Otrzymasz taki sam wynik, jeśli otworzysz oryginalny JPEG w podglądzie i wyeksportujesz jako (1) PNG; (2) Kopia JPG. Zagraj z ustawieniami kompresji, zobaczysz ogromną różnicę w rozmiarach i jakości plików. – foundry

+0

dzięki. Załóżmy, że czytam lokalny lub online obraz png, to czy rozmiar będzie taki sam? –

Powiązane problemy