7

Używam UIImagePNGRepresentation do zapisywania obrazu. Obraz wynikowy ma rozmiar ponad 30 KB i jest WIELKI w moim przypadku.Jak skompresować rozmiar obrazu za pomocą UIImagePNGRepresentation - iOS?

Próbowałem użyć UIImageJPEGRepresentation i pozwala on kompresować obraz, więc zapisuje obraz w rozmiarze < 5KB, co jest wspaniałe, ale zapisanie go w formacie JPEG daje mu białe tło, którego nie chcę (mój obraz jest okrągły, więc Muszę zapisać go z przezroczystym tłem).

Jak mogę skompresować rozmiar obrazu, używając UIImagePNGRepresentation?

+1

Odpowiedź jest prosta, nie można, dopóki nie zdecydujesz się na kompromis wymiar obrazu. 'UIImagePNGRepresentation' zwraca najmniejszy możliwy rozmiar skompresowanego obrazu, a ponieważ jest to metoda kompresji bezstratnej, nie może ona naruszyć jakości obrazu, w przeciwieństwie do JPEG. Tak więc jedyną możliwością jest zmniejszenie wymiaru obrazu. –

+1

@AyanSengupta To nie jest prawda, istnieje wiele sposobów, aby obraz PNG mógł uzyskać lepszą kompresję (różne ustawienia nadmuchania, inne ustawienia, paleta), ale aby wybrać najlepszy, musielibyśmy wypróbować je wszystkie. Istnieją specjalne narzędzia do optymalizacji obrazów PNG, ale nie możemy oczekiwać, że zrobi to prosty enkoder graficzny. – Sulthan

+1

Jeśli twój obraz nie ma wielu kolorów, możesz przejść z PNG-8 (PNG z 256 paletą kolorów), który jest zwykle mniejszy. Może być trudno zmusić UIImagePNGRepresentation do utworzenia takiego formatu, więc możesz spróbować przekonwertować 'UIImage' na dane rgb, a następnie wypróbować inny koder PNG, np. libpng. Ostatecznie wszystko zależy od tego, jaki masz obraz. – Sulthan

Odpowiedz

2

PNG używa bezstratnej kompresji, dlatego UIImagePNGRepresentation nie akceptuje parametru compressionQuality, takiego jak UIImageJPEGRepresentation robi. Możesz uzyskać nieco mniejszy plik PNG z różnymi narzędziami, ale nie tak jak z JPEG.

1

Może być to będzie ci pomóc:

- (void)resizeImage:(UIImage*)image{ 

    NSData *finalData = nil; 
    NSData *unscaledData = UIImagePNGRepresentation(image); 

    if (unscaledData.length > 5000.0f) { 


     //if image size is greater than 5KB dividing its height and width maintaining proportions 


     UIImage *scaledImage = [self imageWithImage:image andWidth:image.size.width/2 andHeight:image.size.height/2]; 
     finalData = UIImagePNGRepresentation(scaledImage); 

     if (finalData.length > 5000.0f) { 

      [self resizeImage:scaledImage]; 
     } 
     //scaled image will be your final image 
    } 
} 

Zmiana rozmiaru obraz

- (UIImage*)imageWithImage:(UIImage*)image andWidth:(CGFloat)width andHeight:(CGFloat)height 
{ 
    UIGraphicsBeginImageContext(CGSizeMake(width, height)); 
    [image drawInRect:CGRectMake(0,0,width,height)]; 
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext() ; 
    return newImage; 
} 
+0

może być wykonana w tle kolejki? (. UIGraphicsBeginImageContext) – gaussblurinc