неділю, 13 травня 2012 р.

Работа с изображениями

Здесь будет несколько примеров как можно работать с изображениями.
Итак, поехали!

Как скачать, создать и показать изображение через 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];
}

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments