2011-08-21 13 views
5

W aplikacji na iPhone'a chcę, aby użytkownik mógł zrobić zdjęcie aparatem, a następnie umieścić ten obraz wśród niektórych zapisanych lokalnie kodu HTML w postaci UIWebView.Wyświetlanie UIImage z kamery w UIWebView

Więc mam obiekt UIImage z UIImagePickerController, teraz muszę dowiedzieć się, jak zapisać go w pamięci, aby móc go odwołać w UIWebView.

Należy pamiętać, że nie chcę tylko obrazu na nim w UIWebView (chcę użyć obrazu jako obrazu tła w jakimś HTML z innymi obrazami ułożonymi na górze). Używam również inne obrazy i HTML, które są przechowywane w aplikacji, że jestem przedstawieniu przez ustawienie baseURL z UIWebView do toru wiązki, jak:

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

Znalazłem to pytanie, które pomogło mi po drodze http://stackoverflow.com/questions/2453023 - jednak nadal ciekawy co inni mogą powiedzieć. –

+0

Jest podobne pytanie tutaj: http://stackoverflow.com/questions/2171029/how-to-display-locally-stored-images-with-a-uiwebview – user281300

Odpowiedz

5

W ten sposób doszłam do tego. W kodzie, który obsługuje obraz zrobione przy użyciu aparatu faktycznie zapisać plik bezpośrednio na płytę:

// 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]; 

Funkcja aby obrócić obraz jest kopiowany prosto z tego bloga, http://blog.logichigh.com/2008/06/05/uiimage-fix/.

Następnie, gdy chcę wyświetlić ten obraz w interfejsie UIWebView, po prostu wykonuję zamianę ciągu na referencję, wprowadzając ścieżkę do obrazu. w moim HTML, dzięki czemu nie ma jak <img src="{CameraPhotoUrl}" /> a następnie:

// 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]; 

Voila! Zauważ, że dołączam parametr ciągu zapytań oparty na dacie do nazwy pliku CameraPhoto.png, aby zapobiec buforowaniu.

6

pewno mają możliwość zapisywania plik lokalnie, uzyskiwanie absolutnej ścieżki i używanie go. Inną opcją, której użyłem w przypadku aplikacji hybrydowej, jest przekonwertowanie ciągu UIImage na Base64 i przekazanie go przez javascript do widoku WWW, aby zrobić to, co chcesz. Aby to zrobić, że po otrzymaniu UIImage zakodować (istnieją różne biblioteki tam, aby to zrobić:

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

Następnie w HTML można mieć metodę, która jest podana obrazy Base64 i ustawia go w pewnym IMG lub tło lub co trzeba:

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

albo

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

Następnie w HTML w WebView byłoby użyć

[mywebview stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"cameraCallback(%@)", base64EncodedImage]]; 
+0

Interesujące, myślę, że by zadziałało. Dobry sposób na uniknięcie konieczności zapisywania pliku na dysku. Moje ewentualne rozwiązanie jest pokazane poniżej. –

+0

Ładne rozwiązanie, ale wydaje się wolniejsze w przypadku dużych obrazów. –