2011-06-17 8 views
11

मैं फोटो लाइब्रेरी से या कैमरे से एक छवि लेने की कोशिश कर रहा हूं।
प्रतिनिधि विधि:आईओएस 4.0+ में बाइट्स में UIImage का आकार कैसे प्राप्त करें?

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo 

मुझे UIImage वस्तु देता है। मुझे अपने आवेदन के लिए bytes में छवि का आकार ढूंढना होगा।

क्या कोई तरीका है कि मैं छवि के फ़ाइल प्रकार और बाइट्स में आकार भी प्राप्त कर सकता हूं?

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

अग्रिम

उत्तर

35

निम्नलिखित कोड का प्रयास करें:

NSData *imageData = [[NSData alloc] initWithData:UIImageJPEGRepresentation((image), 1.0)]; 

int imageSize = imageData.length; 
NSLog(@"SIZE OF IMAGE: %i ", imageSize); 
+0

धन्यवाद यह मेरे लिए काम करता है ... :) :) – devsri

+2

UIImageJPEGRepresentation में संपीड़न गुणवत्ता के लिए सही मूल्य क्या होना चाहिए? मैं यहां 0.5 देखता हूं, जो मेरे गणना आकार को मूल से छोटा बनाता है और 1 इसे बड़ा बनाता है। – R3D3vil

+5

यह बहुत गलत है। – Milo

2

से धन्यवाद: @fbrereto के answer:

एक UIImage की अंतर्निहित डेटा, भिन्न हो सकते हैं तो एक ही "छवि" के लिए एक डेटा के विभिन्न आकार हो सकता है। एक चीज जो आप कर सकते हैं UIImagePNGRepresentation या UIImageJPEGRepresentation का उपयोग NSData समकक्ष समकक्ष प्राप्त करने के लिए करें, फिर उसके आकार की जांच करें।

से: @Meet के answer:

UIImage *img = [UIImage imageNamed:@"sample.png"]; 
NSData *imgData = UIImageJPEGRepresentation(img, 1.0); 
NSLog(@"Size of Image(bytes):%d",[imgData length]); 
0
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)editInfo{ 
    UIImage *image=[editInfo valueForKey:UIImagePickerControllerOriginalImage]; 
    NSURL *imageURL=[editInfo valueForKey:UIImagePickerControllerReferenceURL]; 
    __block long long realSize; 

    ALAssetsLibraryAssetForURLResultBlock resultBlock=^(ALAsset *asset) 
    { 
     ALAssetRepresentation *representation=[asset defaultRepresentation]; 
     realSize=[representation size]; 
    }; 

    ALAssetsLibraryAccessFailureBlock failureBlock=^(NSError *error) 
    { 
     NSLog(@"%@", [error localizedDescription]); 
    }; 

    if(imageURL) 
    { 
     ALAssetsLibrary *assetsLibrary=[[[ALAssetsLibrary alloc] init] autorelease]; 
     [assetsLibrary assetForURL:imageURL resultBlock:resultBlock failureBlock:failureBlock]; 
    } 
} 
17

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन एक NSData वस्तु बनाने सिर्फ बाइट प्राप्त करने के लिए एक छवि का आकार वास्तव में महंगा ऑपरेशन हो सकता है। छवि 20Mb पर और समान रूप से आकार वस्तु बनाने सिर्फ पहले एक का आकार प्राप्त करने के लिए कर सकते हैं ...

मैं इस श्रेणी का उपयोग करते हैं:

UIImage + CalculatedSize.h

#import <UIKit/UIKit.h> 

@interface UIImage (CalculatedSize) 

-(NSUInteger)calculatedSize; 

@end 

UIImage + CalculatedSize.m

#import "UIImage+CalculatedSize.h" 

@implementation UIImage (CalculatedSize) 

-(NSUInteger)calculatedSize 
{  
    return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage); 
} 

@end 

आप बस 012 आयातऔर इसे इस तरह का उपयोग करें:

NSLog (@"myImage size is: %u",myImage.calculatedSize); 

या, यदि आप श्रेणियों का उपयोग कर से बचना चाहते हैं:

NSUInteger imgSize = CGImageGetHeight(anImage.CGImage) * CGImageGetBytesPerRow(anImage.CGImage); 

संपादित करें:

निश्चित रूप से इस गणना जेपीईजी के साथ कोई संबंध नहीं है/पीएनजी संपीड़न। यह अंतर्निहित CGimage से संबंधित है:

एक बिटमैप (या नमूना) छवि पिक्सल का एक आयताकार सरणी प्रत्येक पिक्सेल एक भी नमूना या एक स्रोत छवि में डेटा बिंदु का प्रतिनिधित्व करता है, साथ।

इस तरह से एक आकार को पुनः प्राप्त करने के तरीके से आपको वास्तव में एक महंगी अतिरिक्त वस्तु बनाने के बिना सबसे खराब स्थिति परिदृश्य जानकारी मिलती है।

+1

+1। उस के शीर्ष पर, 'UIImageJPEGRepresentation' के लिए कॉल ही स्मृति और सीपीयू दोनों भूख लगी है। – dokkaebi

+1

लेकिन क्या यह भी सही छवि आकार वापस करेगा? जेपीईजी और पीएनजी दोनों संपीड़ित हैं। – Legoless

+0

यह सही आकार नहीं देता है, http://stackoverflow.com/a/1296933/1418457 देखें – onmyway133

संबंधित मुद्दे