Здесь будет несколько примеров как можно работать с изображениями.
Итак, поехали!
Как скачать, создать и показать изображение через URL
URL на удаленное изображение
NSURL *url = [NSURL URLWithString: @"http://darknessproduction.ru/ifullstat.png"];
Создание UIImage из NSData
UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];
Поместим на наш UIView
NSURL *url = [NSURL URLWithString: @"http://darknessproduction.ru/ifullstat.png"]; UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]]; [self.view addSubview:[[[UIImageView alloc] initWithImage:image] autorelease]];
Закругляем изображения
Добавляем
#include <QuartzCore/QuartzCore.h>
в viewDidLoad нашего контроллера прописываем:
CALayer * ourLayer = [imageView layer]; // Будем округлять UIImageView ourLayer.cornerRadius = 8.0f; // Задаем радиус для округления. ourLayer.masksToBounds = YES; // Чтобы за овальной границей в углах ничего не рисовалось ourLayer.borderWidth = 0.0f; // Границу рисовать не будем. Если нужна - указываем толщину
Ну и собственно всё. Очевидно, что если хотим получить овальный View, указываем cornerRadius равный половине длины короткой стороны нашего View.
Как сделать анимацию из картинок
GIF грузить не получится стандартными средствами SDK, так что если речь идет не о анимации в OpenGL, то делайте так:
1. создаете UIImageView
2. грузите серию изображений вашей анимации как массив UIImage объектов
3. проставляете массив изображений для свойства animationImages в UIImageView
4. устанавливаете продолжительность анимации в свойстве animationDuration
5. startAnimating для UIImageView
NSArrray *theImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"image_1.png"], [UIImage imageNamed:@"image_2.png"], [UIImage imageNamed:@"image_3.png"], [UIImage imageNamed:@"image_4.png"], [UIImage imageNamed:@"image_5.png"], nil]; UIImageView *anImageView = ... //мембер класса, или создаете по месту, не важно anImageView.animationImages = theImages; anImageView.animationDuration = 1.0; // 1 секунда [anImageView startAnimating];
Как отправить емейл с вложениями, используя камеру и фотоальбом
Запуск камеры iPhone
- (void)buttonPressed:(UIButton *)button { // Создание image picker controller UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; // Устанавливаем сорс для камеры imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; // Текущий Delegate imagePicker.delegate = self; // Вырубаем редактирование изображений imagePicker.allowsImageEditing = NO; // Показываем image picker [self presentModalViewController:imagePicker animated:YES]; }
Конвертируем изображение с камеры в NSData
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // Берем изображение из информации словаря UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; // Закрываем окно камеры [self dismissModalViewControllerAnimated:YES]; // Запускаем функцию отправки изображения по почте [self performSelector:@selector(emailImage:) withObject:image afterDelay:1.0]; // Релизим picker [picker release]; }
Отправка изображения с камеры
- (void)emailImage:(UIImage *)image { MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; picker.mailComposeDelegate = self; // Устанавливаем тему письма [picker setSubject:@"Picture from my iPhone!"]; // Добавляем адреса почты, куда будем отсылать [picker setToRecipients:[NSArray arrayWithObjects:@"(Гости не видят ссылок. )", @"(Гости не видят ссылок. )", nil]]; [picker setCcRecipients:[NSArray arrayWithObject:@"(Гости не видят ссылок. )"]]; [picker setBccRecipients:[NSArray arrayWithObject:@"(Гости не видят ссылок. )"]]; // Устанавливаем тело сообщения NSString *emailBody = @"I just took this picture, check it out."; // Вырубаем XTML формат [picker setMessageBody:emailBody isHTML:NO]; // Создаем NSData из PNG изображения с камеры NSData *data = UIImagePNGRepresentation(image); // Добавляем изображение к письму как вложение [picker addAttachmentData:data mimeType:@"image/png" fileName:@"CameraImage"]; // Показываем окно отправки письма [self presentModalViewController:picker animated:YES]; // Релизим picker [picker release]; } - (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { // Закрываем окно отправки письма [self dismissModalViewControllerAnimated:YES]; }
Как анимированно вращать изображение
Радианы и градусы
Переводим из градусов в радианы
// This is defined in Math.h #define M_PI 3.14159265358979323846264338327950288 /* pi */ #define DEGREES_TO_RADIANS(angle) ((angle / 180.0) * M_PI)
Вращаем изображение
- (void)rotateImage:(UIImageView *)image duration:(NSTimeInterval)duration curve:(int)curve degrees:(CGFloat)degrees { // Устанавливаем анимацию [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:duration]; [UIView setAnimationCurve:curve]; [UIView setAnimationBeginsFromCurrentState:YES]; CGAffineTransform transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(degrees)); image.transform = transform; [UIView commitAnimations]; }
Вызов вращения
- (void)startApp { UIImageView *imageToMove = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ArrowUp.png"]]; imageToMove.frame = CGRectMake(10, 10, 20, 100); [self.view addSubview:imageToMove]; [self rotateImage:imageToMove duration:3.0 curve:UIViewAnimationCurveEaseIn degrees:180]; }
Как анимированно передвинуть изображение
Передвижение изображения
- (void)moveImage:(UIImageView *)image duration:(NSTimeInterval)duration curve:(int)curve x:(CGFloat)x y:(CGFloat)y { // Устанавливаем анимацию [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:duration]; [UIView setAnimationCurve:curve]; [UIView setAnimationBeginsFromCurrentState:YES]; // The transform matrix CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y); image.transform = transform; [UIView commitAnimations]; }
Вызов передвижения
- (void)startApp { UIImageView *imageToMove = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Square.png"]]; imageToMove.frame = CGRectMake(10, 10, 20, 100); [self.view addSubview:imageToMove]; [self moveImage:imageToMove duration:3.0 curve:UIViewAnimationCurveLinear x:50.0 y:50.0]; }
Как сохранить UIImage в PNG или JPG
//Создадим пути для выходных форматов NSString *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.png"]; NSString *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"]; // Запишем UIImage в JPEG с минимальным сжатием (наилучшее качество) [UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES]; // Запишем UIImage в PNG [UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES]; // Проверим как хорошо у нас записалось: // Создаем файл-менеджер NSError *error; NSFileManager *fileMgr = [NSFileManager defaultManager]; // Устанавливаем директорию Документов NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; // Проверяем список файлов, который содержит директория Документов NSLog(@"Директория Документов: %@", [fileMgr contentsOfDirectoryAtPath:documentsDirectory error:&error]);
Как сделать снимок с камеры и сохранить в фотоальбом
Запускаем камеру
// Создаем image picker controller UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; // Устанавливаем сорс камеры imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; // Текущий Delegate imagePicker.delegate = self; // Выключаем редактирование изображения imagePicker.allowsImageEditing = NO; // Покажем image picker [self presentModalViewController:imagePicker animated:YES];
Сохранение изображения в Фотоальбом
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; // Сохраняем изображение UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); [picker release]; } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { UIAlertView *alert; // Проверяем доступность сохранения изображения if (error) alert = [[UIAlertView alloc] initWithTitle:@"Ошибка" message:@"Невозможно сохранить изображения." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; else // все хорошо alert = [[UIAlertView alloc] initWithTitle:@"Успех" message:@"Изображение сохранено." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; [alert release]; }
Как изменить размер изображения
UIImage *UImageFromPathScaledToSize(NSString* path, CGSize toSize) { UIImage *scaledImg = nil; UIImage *img1 = [[UIImage alloc] initWithContentsOfFile:path]; // get the image if( img1 ) { float scale = GetScaleForProportionalResize( img1.size, toSize, false, false ); CGImageRef cgImage = CreateCGImageFromUIImageScaled( img1, scale ); if( cgImage ) { scaledImg = [UIImage imageWithCGImage:cgImage]; // autoreleased CGImageRelease( cgImage ); }
[img1 release];
} return scaledImg; }
Как разбить большое изображение на куски равного размера
Иногда бывает удобно изображение одинакового размера затолкать в одно большое изображение, чтобы не разводить кучу файлов, для разбивки используем код:
@interface UIImage (Utilities) - (NSMutableArray*) getTilesWithSize:(CGSize)tileSize; @end //------------------------------------------------------------------------ @implementation UIImage (Utilities) - (NSMutableArray*) getTilesWithSize:(CGSize)tileSize { NSUInteger countW = self.size.width / tileSize.width; NSUInteger countH = self.size.height / tileSize.height; NSMutableArray* array = [NSMutableArray arrayWithCapacity:(countW * countH)]; CGRect rect = CGRectMake(0, 0, tileSize.width, tileSize.height); NSUInteger w; NSUInteger h; for (h = 0, rect.origin.y = 0; h < countH; h++, rect.origin.y += tileSize.height) { for (w = 0, rect.origin.x = 0; w < countW; w++, rect.origin.x += tileSize.width) { CGImageRef tileImageRef = CGImageCreateWithImageInRect(self.CGImage, rect); [array addObject:[UIImage imageWithCGImage:tileImageRef]]; CGImageRelease(tileImageRef); } } return array; } @end
Использование:
UIImage* image; NSMutableArray* normalImages; NSMutableArray* highlightedImages; image = [UIImage imageNamed:@"ImagesSet_Buttons_Normal.png"]; normalImages = [image getTilesWithSize:CGSizeMake(66, 66)]; image = [UIImage imageNamed:@"ImagesSet_Buttons_Highlighted.png"]; normalImages = [image getTilesWithSize:CGSizeMake(66, 66)];
Как обрезать картинку
// Создаем UIImage из существующего PNG-файла UIImage *image = [UIImage imageNamed:@"prgBinary.jpg"]; UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; // Берем размер текущего изображения CGSize size = [image size]; // Делаем imageView по размеру изображения и добавляем в наше представление [imageView setFrame:CGRectMake(0, 0, size.width, size.height)]; [[self view] addSubview:imageView]; [imageView release]; // Создаем прямоугольную область, которую надо обрезать CGRect rect = CGRectMake(size.width / 4, size.height / 4 , (size.width / 2), (size.height / 2)); // Создаем bitmap изображения CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect); UIImage *img = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); // Создаем и показываем изображение из bitmap imageView = [[UIImageView alloc] initWithImage:img]; [imageView setFrame:CGRectMake(0, 200, (size.width / 2), (size.height / 2))]; [[self view] addSubview:imageView]; [imageView release];
Как сделать изображение черно-белым
- (UIImage *)convertImageToGrayScale:(UIImage *)image { CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); // Выбираем Черно-белую палитру CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); // Создаем bitmap и контекст CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); CGContextDrawImage(context, imageRect, [image CGImage]); CGImageRef imageRef = CGBitmapContextCreateImage(context); // Создаем UIImage UIImage *newImage = [UIImage imageWithCGImage:imageRef]; // Релизим палитру, битмап и контекст CGColorSpaceRelease(colorSpace); CGContextRelease(context); CFRelease(imageRef); // Возвращаем уже черно-белое изображение return newImage; }
Как сделать снимок экрана
Настраиваем пользовательский интерфейс
- (id)init { if (self = [super init]) { self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease]; self.view.backgroundColor = [UIColor grayColor]; // Кнопка активации камеры button = [[UIButton alloc] initWithFrame:CGRectMake(80, 55, 162, 53)]; [button setBackgroundImage:[UIImage imageNamed:@"Camera.png"] forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview:button]; [button release]; } return self; }
Вызов UIGetScreenImage()
CGImageRef UIGetScreenImage(void); - (void)buttonPressed:(UIButton *)button { // Создаем скрин экрана и добавляем его в UIImage CGImageRef screen = UIGetScreenImage(); UIImage* image = [UIImage imageWithCGImage:screen]; CGImageRelease(screen); // Сохраняем UIImage в фотоальбом UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); }
Сохранение скрина экрана в фотоальбом
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { UIAlertView *alert; // Проверяем возможность сохранения if (error) alert = [[UIAlertView alloc] initWithTitle:@"Ошибка" message:@"Невозможно сохранить." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; else // Все хорошо alert = [[UIAlertView alloc] initWithTitle:@"Успех" message:@"Изображение сохранено." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show]; [alert release]; }