2011-08-21 13 views
5

में कैमरे से UIImage प्रदर्शित करें मेरे आईफोन ऐप में, मैं चाहता हूं कि उपयोगकर्ता कैमरे के साथ एक तस्वीर ले सकें, फिर उस छवि को UIWebView में कुछ स्थानीय रूप से संग्रहीत HTML में शामिल किया जाए।UIWebView

तो मैं UIImagePickerController से UIImage वस्तु मिल गया है, अब मैं कैसे स्मृति में सहेजने के लिए तो मैं UIWebView में यह संदर्भित कर सकते हैं पता लगाने के लिए की जरूरत है।

ध्यान दें कि मैं सिर्फ UIWebView में अपनी छवि नहीं चाहता हूं (मैं कुछ एचटीएमएल में पृष्ठभूमि-छवि के रूप में चित्र को शीर्ष पर स्तरित अन्य छवियों के साथ उपयोग करना चाहता हूं)। मैं भी अन्य छवियों और HTML कि एप्लिकेशन में संगृहीत उपयोग कर रहा हूँ, कि मैं बंडल पथ के लिए UIWebView की baseURL की स्थापना, जैसे द्वारा संदर्भित कर रहा हूँ:

NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; 
[self.webView loadHTMLString:html baseURL:baseURL]; 
+0

इस प्रश्न को मिला जिसने मुझे http://stackoverflow.com/questions/2453023 के रास्ते में मदद की है - हालांकि अभी भी उत्सुक है कि अन्य क्या कह सकते हैं। –

+0

यहां एक समान प्रश्न है: http://stackoverflow.com/questions/2171029/how-to-display-locally-stored-images-with-a-uiwebview – user281300

उत्तर

5

इस तरह से मैंने इसे समाप्त कर दिया। कोड संभालती है कि छवि कैमरे का उपयोग कर लिया मैं वास्तव में डिस्क को सीधे फ़ाइल को सहेजने में:

// Get the image out of the camera 
UIImage *image = (UIImage *)[info valueForKey:UIImagePickerControllerOriginalImage]; 

// Images from the camera are always in landscape, so rotate 
UIImage *rotatedImage = scaleAndRotateImage(self.image); 

// Save the image to the filesystem 
NSData *imageData = UIImagePNGRepresentation(rotatedImage); 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString* savePath = [documentsPath stringByAppendingPathComponent:@"CameraPhoto.png"]; 
BOOL result = [imageData writeToFile:savePath atomically:YES]; 

समारोह छवि को घुमाने के इस ब्लॉग, http://blog.logichigh.com/2008/06/05/uiimage-fix/ से सीधे कॉपी किया जाता है।

तब जब मैं UIWebView के भीतर इस छवि को प्रदर्शित करना चाहता हूं, तो मैं छवि के पथ को इंजेक्ट करने के संदर्भ में एक स्ट्रिंग को प्रतिस्थापित करता हूं। तो मेरी HTML में वहाँ <img src="{CameraPhotoUrl}" /> और उसके बाद की तरह है:

// Build the reference to the image we just saved 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *cameraImagePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"CameraPhoto.png?x=%@", [[NSDate date] description]]]; 

// Load the HTML into the webview 
NSString *htmlFilePath = [[NSBundle mainBundle] pathForResource:@"MyHtmlFile" ofType:@"htm"]; 
NSString *html = [NSString stringWithContentsOfFile:htmlFilePath encoding:NSUTF8StringEncoding error:nil]; 
html = [html stringByReplacingOccurrencesOfString:@"{CameraPhotoUrl}" withString:cameraImagePath]; 
NSURL *baseURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]; 
[self.webView loadHTMLString:html baseURL:baseURL]; 

देखा! ध्यान दें कि मैं कैशिंग को रोकने के लिए CameraPhoto.png फ़ाइल नाम पर डेट-आधारित क्वेरी स्ट्रिंग पैरामीटर जोड़ रहा हूं।

6

आप निश्चित रूप से सहेजने का विकल्प है स्थानीय रूप से फ़ाइल करें, इसे पूर्ण पथ प्राप्त करें और इसका उपयोग करें। एक बार जब मैं हाइब्रिड ऐप के लिए उपयोग करता हूं तो एक और विकल्प UIImage को बेस 64 स्ट्रिंग में परिवर्तित कर रहा है और जावास्क्रिप्ट के माध्यम से वेबव्यू के माध्यम से जो भी आप करना चाहते हैं उसे करने के लिए पास कर सकते हैं। कि ऐसा करने के लिए UIImage यह सांकेतिक शब्दों में बदलना प्राप्त करने के बाद (वहाँ विभिन्न पुस्तकालयों यह करने के लिए वहाँ बाहर हैं:

UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
NSString *base64EncodedImage = [Base64 encode:UIImageJPEGRepresentation(image, 0.5)]; 

फिर अपने HTML में आप विधि है कि बेस 64 छवियों को देखते हुए और कुछ आईएमजी या करने के लिए यह सेट किया जाता है हो सकता था पृष्ठभूमि या जो भी आप की जरूरत है:

function cameraCallback(imageData) { 
    var image = document.getElementById('myImage'); 
    image.src = "data:image/jpeg;base64," + imageData; 
} 

या

<img src="data:image/gif;base64, [YOUR BASE64 STRING HERE]" alt="" width="80" height="15" /> 

फिर वेबव्यू में HTML में आप

का प्रयोग करेंगे
[mywebview stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"cameraCallback(%@)", base64EncodedImage]]; 
+0

दिलचस्प, मुझे लगता है कि यह काम करेगा। फ़ाइल को वास्तव में डिस्क में सहेजने से बचने का अच्छा तरीका। मेरा अंतिम समाधान नीचे दिखाया गया है। –

+0

एक अच्छा समाधान है लेकिन यह बड़ी छवियों के लिए धीमा लगता है। –