monotouch拍照、选择图片上传实现

不多说,上码:


选择图片上传========》

using System;
using System.Drawing;
using MonoTouch.AssetsLibrary;
using MonoTouch.UIKit;
using MonoTouch.Foundation;

namespace world
{
	public class ImageViewController : UIViewController
	{
		UIImagePickerController imagePicker;
		UIButton choosePhotoButton;
		UIImageView imageView;

		public ImageViewController ()
		{
		}

		public override void ViewWillAppear (bool animated)
		{
			base.ViewWillAppear (animated);
			this.NavigationController.SetNavigationBarHidden (false, false);
		}

		public override void ViewDidLoad ()
		{
			base.ViewDidLoad ();
			Title = "选择图片";
			View.BackgroundColor = UIColor.White;

			imageView = new UIImageView (new RectangleF (10, 80, 300, 300));
			Add (imageView);

			choosePhotoButton = UIButton.FromType (UIButtonType.RoundedRect);
			choosePhotoButton.Frame = new RectangleF (10, 200, 100, 40);
			choosePhotoButton.SetTitle ("Picker", UIControlState.Normal);
			choosePhotoButton.TouchUpInside += (s, e) => {
				// create a new picker controller
				imagePicker = new UIImagePickerController ();

				// set our source to the photo library
				imagePicker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;

				// set what media types
				imagePicker.MediaTypes = UIImagePickerController.AvailableMediaTypes (UIImagePickerControllerSourceType.PhotoLibrary);

				imagePicker.FinishedPickingMedia += Handle_FinishedPickingMedia;
				imagePicker.Canceled += Handle_Canceled;

				// show the picker
				NavigationController.PresentViewController (imagePicker, true, null);
			};
			View.Add (choosePhotoButton);
		}

		// Do something when the
		void Handle_Canceled (object sender, EventArgs e)
		{
			Console.WriteLine ("picker cancelled");
			imagePicker.DismissViewController (true, null);
		}

		// This is a sample method that handles the FinishedPickingMediaEvent
		protected void Handle_FinishedPickingMedia (object sender, UIImagePickerMediaPickedEventArgs e)
		{
			// determine what was selected, video or image
			bool isImage = false;
			switch (e.Info [UIImagePickerController.MediaType].ToString ()) {
			case "public.image":
				Console.WriteLine ("Image selected");
				isImage = true;
				break;

			case "public.video":
				Console.WriteLine ("Video selected");
				break;
			}

			Console.WriteLine (" ==> Reference URL: [" + UIImagePickerController.ReferenceUrl + "]");

			// get common info (shared between images and video)
			NSUrl referenceURL = e.Info [new NSString ("UIImagePickerControllerReferenceURL")] as NSUrl;
			if (referenceURL != null)
				Console.WriteLine (referenceURL.ToString ());

			// if it was an image, get the other image info
			if (isImage) {

				// get the original image
				UIImage originalImage = e.Info [UIImagePickerController.OriginalImage] as UIImage;
				if (originalImage != null) {
					// do something with the image
					Console.WriteLine ("got the original image");

					var documentsDirectory = Environment.GetFolderPath (Environment.SpecialFolder.Personal);
					string jpgFilename = System.IO.Path.Combine (documentsDirectory, DateTime.Now.ToString ("yyyyMMddHHmmss") + ".jpg");
					NSData imgData = originalImage.AsJPEG ();
					NSError err = null;
					if (imgData.Save (jpgFilename, false, out err)) {
						Console.WriteLine ("saved as " + jpgFilename);
					} else {
						Console.WriteLine ("NOT saved as " + jpgFilename + " because" + err.LocalizedDescription);
					}

					//imageView.Image = originalImage;
					imageView.Image = UIImage.FromFile (jpgFilename);
				}

				// get the edited image
				UIImage editedImage = e.Info [UIImagePickerController.EditedImage] as UIImage;
				if (editedImage != null) {
					// do something with the image
					Console.WriteLine ("got the edited image");
					imageView.Image = editedImage;
				}

				//- get the image metadata
				NSDictionary imageMetadata = e.Info [UIImagePickerController.MediaMetadata] as NSDictionary;
				if (imageMetadata != null) {
					// do something with the metadata
					Console.WriteLine ("got image metadata");
				}

			}
			// if it's a video
			else {
				// get video url
				NSUrl mediaURL = e.Info [UIImagePickerController.MediaURL] as NSUrl;
				if (mediaURL != null) {
					//
					Console.WriteLine (mediaURL.ToString ());
				}
			}

			// dismiss the picker
			imagePicker.DismissViewController (true, null);
		}

		//...

	}
}
注意,从模拟器中调试的时候,选择的图片需要先黏贴,然后保存,才可以选择。关于这点百度一下就知道了。

拍照实现图片上传,核心代码如下:

//
// Camera.cs: Support code for taking pictures
//
// Copyright 2010 Miguel de Icaza
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

using System;
using MonoTouch.UIKit;
using MonoTouch.Foundation;

namespace TweetStation
{
	//
	// A static class that will reuse the UIImagePickerController
	// as iPhoneOS has a crash if multiple UIImagePickerController are created
	//   http://stackoverflow.com/questions/487173
	// (Follow the links)
	//
	public static class Camera
	{
		static UIImagePickerController picker;
		static Action<NSDictionary> _callback;
		
		static void Init ()
		{
			if (picker != null)
				return;
			
			picker = new UIImagePickerController ();
			picker.Delegate = new CameraDelegate ();
		}
		
		class CameraDelegate : UIImagePickerControllerDelegate {
			public override void FinishedPickingMedia (UIImagePickerController picker, NSDictionary info)
			{
				var cb = _callback;
				_callback = null;
				
				picker.DismissViewController (true, null);
				cb (info);
			}
		}

		//照相
		public static void TakePicture (UIViewController parent, Action<NSDictionary> callback)
		{
			Init ();
			picker.SourceType = UIImagePickerControllerSourceType.Camera;
			_callback = callback;
			parent.PresentViewController (picker, true, null);
		}
		
		public static void SelectPicture (UIViewController parent, Action<NSDictionary> callback)
		{
			Init ();
			picker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
			_callback = callback;
			parent.PresentViewController (picker, true, null);
		}
	}
}
using System;
using System.Drawing;
using MonoTouch.AssetsLibrary;
using MonoTouch.UIKit;
using MonoTouch.Foundation;

namespace ImageView {

	public class ImageViewController : UIViewController {
		
		UIButton cameraButton;

		public override void ViewDidLoad ()
		{
			base.ViewDidLoad ();
			Title = "Save to Album";
			View.BackgroundColor = UIColor.White;

			cameraButton = UIButton.FromType (UIButtonType.RoundedRect);
			cameraButton.Frame = new RectangleF(10, 200, 100,40);
			cameraButton.SetTitle ("Camera", UIControlState.Normal);
			cameraButton.TouchUpInside += (sender, e) => {
			
				TweetStation.Camera.TakePicture (this, (obj) =>{
					// https://developer.apple.com/library/ios/#documentation/uikit/reference/UIImagePickerControllerDelegate_Protocol/UIImagePickerControllerDelegate/UIImagePickerControllerDelegate.html#//apple_ref/occ/intfm/UIImagePickerControllerDelegate/imagePickerController:didFinishPickingMediaWithInfo:
					var photo = obj.ValueForKey(new NSString("UIImagePickerControllerOriginalImage")) as UIImage;
					var meta = obj.ValueForKey(new NSString("UIImagePickerControllerMediaMetadata")) as NSDictionary;
					
// This bit of code saves to the Photo Album with metadata
					ALAssetsLibrary library = new ALAssetsLibrary();
					library.WriteImageToSavedPhotosAlbum (photo.CGImage, meta, (assetUrl, error) =>{
						Console.WriteLine ("assetUrl:"+assetUrl);
					});
					

// This bit of code does basic 'save to photo album', doesn't save metadata
//			var someImage = UIImage.FromFile("someImage.jpg");
//			someImage.SaveToPhotosAlbum ((image, error)=> {
//				var o = image as UIImage;
//				Console.WriteLine ("error:" + error);
//			});
					

// This bit of code saves to the application's Documents directory, doesn't save metadata
//					var documentsDirectory = Environment.GetFolderPath
//					                          (Environment.SpecialFolder.Personal);
//					string jpgFilename = System.IO.Path.Combine (documentsDirectory, "Photo.jpg");
//					NSData imgData = photo.AsJPEG();
//					NSError err = null;
//					if (imgData.Save(jpgFilename, false, out err))
//					{
//					    Console.WriteLine("saved as " + jpgFilename);
//					} else {
//					    Console.WriteLine("NOT saved as" + jpgFilename + " because" + err.LocalizedDescription);
//					}


				});
			};
			View.Add (cameraButton);
			
			if (!UIImagePickerController.IsSourceTypeAvailable (UIImagePickerControllerSourceType.Camera)) {
				cameraButton.SetTitle ("No camera", UIControlState.Disabled);
				cameraButton.SetTitleColor (UIColor.Gray, UIControlState.Disabled);
				cameraButton.Enabled = false;
			}
		}
	}
}
顺便说一下,
originalImage.AsJPEG ();
后面有一个 AsStream属性,这样可以对选择的图片进行远程服务器上传,你懂的。

你可能感兴趣的:(AsStream,AsJPEG,NSData.Save)