2011-08-21 9 views
5

En mi aplicación para iPhone, quiero que el usuario pueda tomar una foto con la cámara, luego hacer que esa imagen aparezca entre algunos HTML almacenados localmente en un UIWebView.Visualizar UIImage desde la cámara en UIWebView

así que tengo el objeto de la UIImageUIImagePickerController, ahora tengo que encontrar la manera de guardarlo en la memoria para que pueda hacer referencia a ella en el UIWebView.

Tenga en cuenta que no solo quiero la imagen por sí sola en el UIWebView (quiero utilizar la imagen como imagen de fondo en algunos HTML con otras imágenes en capas en la parte superior). También estoy usando otras imágenes y HTML que se almacenan en la aplicación, que estoy haciendo referencia estableciendo la baseURL del UIWebView a la trayectoria paquete, como:

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

Encontré esta pregunta que me ha ayudado a lo largo del camino http://stackoverflow.com/questions/2453023 - sin embargo sigue siendo curioso lo que otros puedan decir. –

+0

Hay una pregunta similar aquí: http://stackoverflow.com/questions/2171029/how-to-display-locally-stored-images-with-a-uiwebview – user281300

Respuesta

5

Así terminé haciendo esto. En el código que se encarga de la imagen tomada con la cámara que realmente guardar el archivo directamente en disco:

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

La función para girar la imagen se copia directamente desde este blog, http://blog.logichigh.com/2008/06/05/uiimage-fix/.

Luego, cuando quiero mostrar esta imagen dentro de UIWebView, simplemente hago una cadena de reemplazo para hacer referencia a la ruta de entrada a la imagen. Así que en mi HTML hay como <img src="{CameraPhotoUrl}" /> y luego:

// 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! Tenga en cuenta que estoy agregando un parámetro de cadena de consulta basado en la fecha al nombre de archivo CameraPhoto.png, simplemente para evitar el almacenamiento en caché.

6

Definitivamente tienes la opción de guardar la archivo localmente, obteniendo su ruta absoluta y usando eso. Otra opción que utilicé para una aplicación híbrida una vez es convertir el UIImage a la cadena Base64 y pasarlo a través de javascript a la vista web para hacer lo que quiera que haga. para hacer eso que después de conseguir el UIImage codificarlo (hay varias bibliotecas que hay que hacer esto:

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

Luego, en el código HTML que podría tener el método que se da las imágenes base64 y lo coloca en cierta IMG o fondo o lo que usted necesita:

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

o

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

Luego, en el HTML en la vista web que usaría

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

Interesante, creo que hubiera funcionado. Una buena manera de evitar tener que guardar realmente el archivo en el disco. Mi solución final se muestra a continuación. –

+0

Una buena solución pero parece más lenta para imágenes grandes. –

Cuestiones relacionadas