7

Görüntüyü kaydetmek için UIImagePNGRepresentation kullanıyorum. Sonuç görüntüsü 30+ KB boyutunda ve bu benim durumumda BÜYÜK.UIImagePNGRepresentation - iOS kullanarak görüntü boyutu nasıl sıkıştırılır?

UIImageJPEGRepresentation kullanmayı denedim ve görüntüyü sıkıştırmaya izin veriyor, bu nedenle < 5KB boyutunda görüntü kaydediyor, ancak JPEG'de kaydetme bunu istemediğim beyaz arka plana sahip oluyor (resmim döngüsel, yani Şeffaf arka plan ile kaydetmem gerekiyor).

Görüntü boyutunu UIImagePNGRepresentation kullanarak nasıl sıkıştırabilirim?

+1

görüntüyü yeniden boyutlandırma, sonra resim boyutunu uzlaşma seçene kadar. “UIImagePNGRepresentation”, görüntü için mümkün olan en az sıkıştırılmış boyutu döndürür ve bu, kayıpsız bir sıkıştırma yöntemi olduğundan, JPEG'in aksine, görüntünün kalitesini tehlikeye alamaz. Dolayısıyla sadece görüntü boyutunu azaltmak mümkündür. –

+1

@AyanSengupta Bu doğru değil, daha iyi bir sıkıştırma (farklı şişirme ayarları, farklı ayarlar, palet) elde etmek için bir PNG görüntüsünün birden fazla yolu vardır, ancak en iyisini seçmek için hepsini denemeliyiz. PNG görüntülerini optimize etmek için özel araçlar var, ancak bunu yapmak için basit bir grafik kodlayıcı bekleyemeyiz. – Sulthan

+1

Görüntünüzde çok fazla renk yoksa, genellikle daha küçük olan PNG-8 (256 renk paletiyle PNG) ile devam edebilirsiniz. UIImagePNGRepresentation'ı bu formatı üretmeye zorlamak zor olabilir, bu nedenle 'UIImage' öğesini rgb'ye dönüştürmeyi denemek isteyebilir ve ardından farklı bir PNG kodlayıcıyı deneyin, örn. libpng. Sonuçta hepsi sahip olduğunuz görüntüye bağlı. – Sulthan

cevap

2

PNG kayıpsız sıkıştırma kullanır, bu nedenle UIImagePNGRepresentation, UIImageJPEGRepresentation gibi compressionQuality parametresini kabul etmez. Farklı araçlarla biraz daha küçük bir PNG dosyası alabilirsiniz, ancak JPEG ile hiç alakası yok.

1

bu size yardımcı olacaktır olabilir:

- (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 
    } 
} 

basit cevap bunu yapamazsınız olduğunu

- (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

arka plan kuyruğunda yapılabilir mi? (. UIGraphicsBeginImageContext) – gaussblurinc

İlgili konular