Отображение UIImage с камеры в UIWebView - PullRequest
5 голосов
/ 21 августа 2011

В моем приложении для iPhone я хочу, чтобы пользователь мог делать снимки с помощью камеры, а затем отображать это изображение среди некоторого локально сохраненного HTML-кода в UIWebView.

Итак, у меня есть объект UIImage из UIImagePickerController, теперь мне нужно выяснить, как сохранить его в памяти, чтобы я мог ссылаться на него в UIWebView.

Обратите внимание, что я не просто хочу, чтобы изображение само по себе в UIWebView (я хочу использовать изображение в качестве фонового изображения в некотором HTML с другими изображениями, расположенными сверху). Я также использую другие изображения и HTML, которые хранятся в приложении, на которые я ссылаюсь, устанавливая baseURL UIWebView в путь к пакету, например:

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

Ответы [ 2 ]

6 голосов
/ 21 августа 2011

У вас определенно есть возможность сохранить файл локально, получить его абсолютный путь и использовать его.Другой вариант, который я однажды использовал для гибридного приложения, - это преобразование UIImage в строку Base64 и передачу его через javascript в веб-представление, чтобы делать все, что вы хотите.Чтобы сделать это после получения UIImage, закодируйте его (есть различные библиотеки, чтобы сделать это:

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

Тогда в вашем HTML вы могли бы иметь метод, который дает изображения base64 и устанавливает его в некоторый IMGили фон, или все, что вам нужно:

 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]];
5 голосов
/ 30 августа 2011

Я так и сделал. В коде, который обрабатывает изображение, снятое с помощью камеры, я фактически сохраняю файл непосредственно на диск:

// 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 просто для предотвращения кэширования.

...