2011-08-27 15 views
16

वर्तमान में मोनो टच के माध्यम से आईफोन विकास के साथ अपना पहला कदम कर रहा हूं, मैं UIImage के साथ खेल रहा हूं जिसे मैंने फोटो लाइब्रेरी से पढ़ा है।पता लगाएं कि यूआईएममेज पीएनजी या जेपीईजी है या नहीं?

जो मैं प्राप्त करना चाहता हूं वह छवि के कच्चे बाइट सरणी (byte[]) प्राप्त करना है।

मुझे पता है कि मोनो टच में UIImageJPEGRepresentation और UIImagePNGRepresentation रैपर हैं। मैं यह भी जानता हूं कि उनका उपयोग कैसे करें। मुझे नहीं पता कि:

मैं कैसे निर्णय ले सकता हूं कि इनमें से कौन से फ़ंक्शन कॉल करें?

आईई। यदि मूल छवि एक जेपीईजी छवि है, तो मैं इसे पीएनजी के रूप में नहीं बल्कि एक जेपीईजी के रूप में भी प्राप्त करना चाहता हूं, और इसके विपरीत।

क्या ऐसा करने का कोई तरीका है, या क्या मुझे इस पर कुछ बिंदु याद आ रही है?

उत्तर

26

एक बार आपके पास UIImage है, तो यह UIImageJPEGRepresentation या UIImagePNGRepresentation का उपयोग कर जेपीईजी या पीएनजी उत्पादन करने में सक्षम है। मूल छवि का प्रारूप केवल तब महत्वपूर्ण है जब UIImage से बनाया जा रहा है (यह तय करता है कि CFImage प्रदाता इसे लोड करने के लिए)।

यदि यह सुनिश्चित करने के लिए कि आप इसे मूल प्रारूप के रूप में सहेजते हैं, तो यह सुनिश्चित करने के लिए आपके ऐप या एल्गोरिदम के लिए महत्वपूर्ण है, मुझे लगता है कि आपको यह लिखने के लिए उस जानकारी को बनाए रखना होगा। मैंने दोबारा जांच की और कुछ भी नहीं मिला जो विज्ञापित करता है कि यह किस प्रारूप से आया था।

क्या आप UIImageView के माध्यम से छवि को बदलने जा रहे हैं या क्या आपके अनुभव में छवि अपरिवर्तित रहती है? यदि यह बदला नहीं गया है और आपको छवि का चयन करने के लिए केवल यूआई की आवश्यकता है, तो क्या आप बाइट्स फाइल कर सकते हैं? उदाहरण के लिए, यदि आपने छवियों को सिर्फ चुनने के लिए दिखाया है और फिर आप उन्हें किसी सर्वर या किसी चीज़ पर अपलोड करते हैं, तो UIImage केवल देखने और चुनने के लिए हो सकता है और यदि आपकी डेटा संरचना याद करती है कि यह किस फ़ाइल से आया है, तो आप बिट्स को वापस ले सकते हैं डिस्क और अपलोड करें। यदि आप दृश्य में फ़ाइल को बदलते हैं, तो आपको या उपयोगकर्ता को छवि के आउटपुट (और गुणवत्ता की जेपीईजी) तय करने की आवश्यकता है।

+0

धन्यवाद, @bryanmac मूल रूप से मैं फोटो लाइब्रेरी से एक छवि का चयन करें और इसे अपलोड करने के लिए एक छोटा सा उपकरण लिख रहा हूँ एक वेब सेवा के माध्यम से। तो मैं छवि का निर्माण नहीं कर रहा हूं, लेकिन बस इसे "उपभोग" कर रहा हूं। हो सकता है कि मैं 'FinishedPickingImage' ओवरराइड के' NSDictionary संपादनInfo' पैरामीटर में कहीं कच्चे बाइट्स प्राप्त कर सकूं? –

+1

तो, अगर मैं समझ गया हूं, तो यह वास्तव में कोई फर्क नहीं पड़ता कि तस्वीर मूल रूप से पीएनजी या जेपीईजी के रूप में अपलोड की गई थी ... एक बार जब आप UIImage प्राप्त करते हैं तो आप इसे दोनों प्रारूपों में परिवर्तित कर सकते हैं? – Fustigador

+1

यदि कोई अल्फा चैनल है, तो आप जानना चाहते हैं कि किस का उपयोग करना है। मैंने एक जेपीईजी लिया और फिर इसे प्रदर्शित करने के लिए यूईमेज का इस्तेमाल किया और फिर इसे स्थानीय डेटा बेस में सेव किया, मैंने पीछे की ओर देखा है कि मुझे इसे डिस्क पर सहेजा जाना चाहिए था, जिसे मैंने UIImagePNGRepresentation के बजाय UIImagePNGRepresentation का उपयोग किया था और बाद में इसे पुनर्स्थापित करने का प्रयास किया था और यह है नतीजा http://imgur.com/2yG3Zv2 जैसा कि आप देख सकते हैं पारदर्शिता गड़बड़ हो जाती है। जैसा कि मैंने कहा था कि मुझे शायद इसे सिर्फ एचडीडी में सहेजा जाना चाहिए और पथ को संग्रहित करना चाहिए लेकिन बिंदु यह है कि कुछ मामलों में इससे कोई फर्क नहीं पड़ता कि आप किस कार्य का उपयोग करते हैं। – Biclops

1

तैयार

typedef NS_ENUM(NSInteger, DownloadImageType) { 
    DownloadImageTypePng, 
    DownloadImageTypeJpg 
}; 

@property (assign, nonatomic) DownloadImageType imageType; 

का पता लगाने

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

    NSString *compareString = [[info objectForKey:UIImagePickerControllerReferenceURL] absoluteString]; 
    NSRange pngRange = [compareString rangeOfString:@"PNG" options:NSBackwardsSearch]; 
    if (pngRange.location != NSNotFound) { 
     compareString = [compareString substringFromIndex:pngRange.location]; 
     self.imageType = DownloadImageTypePng; 
     NSLog(@"%@", compareString); 
    } else { 
     NSLog(@"Not PNG"); 
    } 

    NSRange jpgRange = [compareString rangeOfString:@"JPG" options:NSBackwardsSearch]; 
    if (jpgRange.location != NSNotFound) { 
     compareString = [compareString substringFromIndex:jpgRange.location]; 
     self.imageType = DownloadImageTypeJpg; 
     NSLog(@"%@", compareString); 
    } else { 
     NSLog(@"Not JPG"); 
    } 

} 

उपयोग

if (self.imageType == DownloadImageTypePng) { 

} else if (self.imageType == DownloadImageTypeJpg) { 

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