2013-09-08 11 views
9

मैं एक ऐप बना रहा हूं जो उपयोगकर्ता को फोटो लेने या आईफोन पर लाइब्रेरी से एक चुनने और इसे पार्स बैकएंड पर अपलोड करने देता है।फ़ाइल आकार को कम करने के लिए छवियों को संपीड़ित करें

मुझे जिस समस्या का सामना करना पड़ रहा है वह फ़ाइल के आकार के संबंध में है।

मैंने पढ़ा है कि फेसबुक, ट्विटर, इंस्टाग्राम और Google जैसे बड़े खिलाड़ी रिज़ॉल्यूशन और फ़ाइल आकार के संबंध में क्या करते हैं लेकिन मैं इसके करीब नहीं जा सकता।

मुझे यकीन है कि उनके पास ऐसा करने के लिए सबसे अच्छा कोड और टूल्स हैं लेकिन मुझे आईओएस नियमित प्रक्रियाओं के साथ जितना संभव हो उतना अच्छा लागू करने में खुशी होगी।

- (UIImage *)normalResImageForAsset:(ALAsset*)asset 
{ 
    // Convert ALAsset to UIImage 
    UIImage *image = [self highResImageForAsset:asset]; 

    // Determine output size 
    CGFloat maxSize = 1024.0f; 
    CGFloat width = image.size.width; 
    CGFloat height = image.size.height; 
    CGFloat newWidth = width; 
    CGFloat newHeight = height; 

    // If any side exceeds the maximun size, reduce the greater side to 1200px and proportionately the other one 
    if (width > maxSize || height > maxSize) { 
     if (width > height) { 
      newWidth = maxSize; 
      newHeight = (height*maxSize)/width; 
     } else { 
      newHeight = maxSize; 
      newWidth = (width*maxSize)/height; 
     } 
    } 

    // Resize the image 
    CGSize newSize = CGSizeMake(newWidth, newHeight); 
    UIGraphicsBeginImageContext(newSize); 
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // Set maximun compression in order to decrease file size and enable faster uploads & downloads 
    NSData *imageData = UIImageJPEGRepresentation(newImage, 0.0f); 
    UIImage *processedImage = [UIImage imageWithData:imageData]; 

    return processedImage; 
} 

मैं 1024px गुणा maximun स्वीकृत आकार (दोनों OT ऊंचाई के साथ) वहाँ कुछ प्रतिबंध शुरू करने के लिए और फिर मैं लागू करने कर रहा हूँ maximun बनाने के लिए कोशिश कर रहा हूँ:

यह अभी मैं क्या कर रहा है आकार को कम करने के लिए संपीड़न।

यह जेपीईजी को वास्तव में हानिकारक किए बिना छवि आकार का लगभग 50% काटता है और कटौती करता है लेकिन यह अभी भी बहुत कुछ है। विशेष रूप से अगर फोन के कैमरे के साथ फोटो लिया जाता है और अपलोड किया जाता है। संसाधित छवि में अभी भी 1 एमबी आकार हो सकता है जो कि बहुत अधिक है।

मुझे लगता है कि मैं कुछ उपयोगी कदम या गलत तकनीक का उपयोग कर सकता हूं।

किसी भी प्रतिक्रिया की सराहना की जाएगी।

+0

मैं NSData करने के लिए UIImage से दोतरफा के बारे में सोच रहा हूँ और वापस UIImage करने के लिए। क्या आपने एक नया UIImage प्रारंभ करने से पहले [imageData लंबाई] की जांच की थी? शायद आप इस फ़ंक्शन से एन्कोडेड NSData ऑब्जेक्ट को वापस करना चाहते हैं, ताकि आप सर्वर पर बाइट सरणी अपलोड कर सकें। – umlum

+0

उपयोगकर्ता को छवि का आकार चुनने की अनुमति दें और यदि आवश्यक हो तो अपलोड करने के लिए डेटा आकार के बारे में उन्हें चेतावनी दें। – Wain

+0

@Wain लेकिन ओपी सही है कि 1024x768px पर, पूरी तरह संपीड़ित जेपीईजी छवि 1 एमबी नहीं लेनी चाहिए। – umlum

उत्तर

9

मुझे एक ही समस्या थी और मैंने यह भी सोचा कि संपीड़न काम नहीं कर रहा था। यह मेरे कोड में कहीं और निकला, मैं अलग संपीड़न का उपयोग कर डिस्क पर फ़ाइल लिख रहा था। हो सकता है कि आप इस फ़ंक्शन के डेटा के साथ वही काम कर रहे हों। कि वास्तव में संपीड़न प्रभावी है की जाँच करने के एक अच्छा तरीका कुछ इस तरह करना है: मैं एक छवि है कि 640x480 का उपयोग कर रहा

NSData *imgData1 = UIImageJPEGRepresentation(newImage, 1.0f); 
NSLog(@"1.0 size: %d", imgData1.length); 

NSData *imgData2 = UIImageJPEGRepresentation(newImage, 0.7f); 
NSLog(@"0.7 size: %d", imgData2.length); 

NSData *imgData3 = UIImageJPEGRepresentation(newImage, 0.4f); 
NSLog(@"0.4 size: %d", imgData3.length); 

NSData *imgData4 = UIImageJPEGRepresentation(newImage, 0.0f); 
NSLog(@"0.0 size: %d", imgData4.length); 

// Don't convert NSData back to UIImage before writing to disk 
[imgData4 writeToFile:imagePath atomically:YES]; 

और मैं (1.0 के लिए) फ़ाइल आकार 325 kB से लेकर मिल 18 करने के लिए नीचे kB (0.0 के लिए)

+0

यह मेरे लिए काम नहीं करता है ... – RaviJSS

+0

एक बार यह सर्वर पर अपलोड हो जाने के बाद और यह वास्तविक छवि का पुनर्निर्माण करने में सक्षम नहीं हो सकता है। सभी परिदृश्यों में उपयोगी नहीं हो सकता है। – Satyam

0

स्विफ्ट -3 @codeMonkey के संस्करण: -

यह छवि के संपीड़न में काम सही

func compressImage() -> UIImage { 

     let oldImage = UIImage(named: "background.jpg") 
     var imageData = Data(UIImagePNGRepresentation(oldImage!)!) 
     print("***** Uncompressed Size \(imageData.description) **** ") 

     imageData = UIImageJPEGRepresentation(oldImage!, 0.025)! 
     print("***** Compressed Size \(imageData.description) **** ") 

     let image = UIImage(data: imageData) 
     return image! 

    } 

enter image description here

+0

छवि की गुणवत्ता के बारे में क्या? – Satyam

+0

संपीड़न द्वारा गुणवत्ता में बदलाव आएगा। – Shrawan

+0

यह तस्वीर की गुणवत्ता को कम करता है। तो, यह सही समाधान नहीं हो सकता है। – Satyam

0
Please Try below answer. 

+(UIImage *)compressImage:(UIImage *)image{ 
float actualHeight = image.size.height; 
float actualWidth = image.size.width; 
float maxHeight = 1136.0f; 
float maxWidth = 640.0f; 
float imgRatio = actualWidth/actualHeight; 
float maxRatio = maxWidth/maxHeight; 
float compressionQuality = 1;//50 percent compression 

if (actualHeight > maxHeight || actualWidth > maxWidth){ 
    if(imgRatio < maxRatio){ 
     //adjust width according to maxHeight 
     imgRatio = maxHeight/actualHeight; 
     actualWidth = imgRatio * actualWidth; 
     actualHeight = maxHeight; 
    } 
    else if(imgRatio > maxRatio){ 
     //adjust height according to maxWidth 
     imgRatio = maxWidth/actualWidth; 
     actualHeight = imgRatio * actualHeight; 
     actualWidth = maxWidth; 
    } 
    else{ 
     actualHeight = maxHeight; 
     actualWidth = maxWidth; 
    } 
}else{ 
    actualHeight = maxHeight; 
    actualWidth = maxWidth; 
    compressionQuality = 1; 
} 

CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); 
UIGraphicsBeginImageContext(rect.size); 
[image drawInRect:rect]; 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality); 
UIGraphicsEndImageContext(); 

return [UIImage imageWithData:imageData]; 
} 
संबंधित मुद्दे