Как обрезать изображение в частях программно -- iphone поле с участием core-graphics пол Связанный проблема

how to crop image in to pieces programmatically


8
vote

проблема

русский

Мне нужно разделить изображение на 9 штук программно. Любые предложения о том, как это сделать?

Английский оригинал

I need to divide an image into 9 pieces programmatically. Any suggestions on how to do this?

</div
     

Список ответов

13
 
vote
vote
Лучший ответ
 

Код ниже также является решением, которое обнаруживает кусок изображения, на котором было запущено. Идея состоит в том, чтобы взять Uiimage и использовать CGIMAGECREATEWITHIMAGEINRECT, чтобы обрезать кусочки. Из обрезанного куска Создайте новый Uiimage и поместите его в UiimageView. Чтобы получить жест Tap для работы, мне пришлось разместить UiimageView в UIView. Наконец, предоставьте жест и уникальный тег, чтобы деталь можно было идентифицировать при подключении.

 <код> - (void)loadView {     UIView* root = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];     UIImage* whole = [UIImage imageNamed:@"whole.jpg"]; //I know this image is 300x300      int partId = 0;     for (int x=0; x<=200; x+=100) {         for(int y=0; y<=200; y+=100) {             CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, 100, 100));             UIImage* part = [UIImage imageWithCGImage:cgImg];             UIImageView* iv = [[UIImageView alloc] initWithImage:part];              UIView* sView = [[UIView alloc] initWithFrame:CGRectMake(200-x, 200-y, 100, 100)];             [sView addSubview:iv];             [iv release];              UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self                                                                                   action:@selector(tap:)];             tap.numberOfTapsRequired = 1;             [sView addGestureRecognizer:tap];             [tap release];              sView.tag = partId;              [root addSubview:sView];             [sView release];             partId++;             CGImageRelease(cgImg);         }     }      self.view = root; }  - (void)tap:(UITapGestureRecognizer*)gesture {     NSLog(@"image tap=%d", gesture.view.tag); }   
 

The code below is also a solution that detects the piece of the picture that was tapped on. The idea is to take a UIImage and use CGImageCreateWithImageInRect to crop out pieces. From the cropped piece create a new UIImage and place it in a UIImageView. In order to get the tap gesture to work I had to place the UIImageView in a UIView. Finally, provide the gesture and a unique tag so that the piece can be identified when tapped on.

- (void)loadView {     UIView* root = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];     UIImage* whole = [UIImage imageNamed:@"whole.jpg"]; //I know this image is 300x300      int partId = 0;     for (int x=0; x<=200; x+=100) {         for(int y=0; y<=200; y+=100) {             CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, 100, 100));             UIImage* part = [UIImage imageWithCGImage:cgImg];             UIImageView* iv = [[UIImageView alloc] initWithImage:part];              UIView* sView = [[UIView alloc] initWithFrame:CGRectMake(200-x, 200-y, 100, 100)];             [sView addSubview:iv];             [iv release];              UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self                                                                                   action:@selector(tap:)];             tap.numberOfTapsRequired = 1;             [sView addGestureRecognizer:tap];             [tap release];              sView.tag = partId;              [root addSubview:sView];             [sView release];             partId++;             CGImageRelease(cgImg);         }     }      self.view = root; }  - (void)tap:(UITapGestureRecognizer*)gesture {     NSLog(@"image tap=%d", gesture.view.tag); } 
</div
 
 
         
         
6
 
vote

Есть много способов нарезать и кости изображения, но вот один. Он использует кварцевый, чтобы разрезать изображение на 9 равных фракций. Обратите внимание, что он не обрабатывает повернутые изображения (тем, что я имею в виду изображения с изображением изображения! = 0) Но он должен начать:

 <код> +(NSArray *)splitImageInTo9:(UIImage *)im{     CGSize size = [im size];     NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:9];     for (int i=0;i<3;i++){         for (int j=0;j<3;j++){             CGRect portion = CGRectMake(i * size.width/3.0, j * size.height/3.0, size.width/3.0, size.height/3.0);             UIGraphicsBeginImageContext(portion.size);             CGContextRef context = UIGraphicsGetCurrentContext();             CGContextScaleCTM(context, 1.0, -1.0);             CGContextTranslateCTM(context, 0, -portion.size.height);             CGContextTranslateCTM(context, -portion.origin.x, -portion.origin.y);             CGContextDrawImage(context,CGRectMake(0.0, 0.0,size.width,  size.height), im.CGImage);             [arr addObject:UIGraphicsGetImageFromCurrentImageContext()];             UIGraphicsEndImageContext();           }     }     return [arr autorelease];  }   

Вывод будет массивом из 9 изображений каждого размера (с / 3, высота / 3)

 

There are many ways to slice and dice an image but here is one. It uses Quartz to cut an image into 9 equal-sized fractions. Notice it does not handle rotated images (by that I mean images with imageOrientation!=0) but it should get you started:

+(NSArray *)splitImageInTo9:(UIImage *)im{     CGSize size = [im size];     NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:9];     for (int i=0;i<3;i++){         for (int j=0;j<3;j++){             CGRect portion = CGRectMake(i * size.width/3.0, j * size.height/3.0, size.width/3.0, size.height/3.0);             UIGraphicsBeginImageContext(portion.size);             CGContextRef context = UIGraphicsGetCurrentContext();             CGContextScaleCTM(context, 1.0, -1.0);             CGContextTranslateCTM(context, 0, -portion.size.height);             CGContextTranslateCTM(context, -portion.origin.x, -portion.origin.y);             CGContextDrawImage(context,CGRectMake(0.0, 0.0,size.width,  size.height), im.CGImage);             [arr addObject:UIGraphicsGetImageFromCurrentImageContext()];             UIGraphicsEndImageContext();           }     }     return [arr autorelease];  } 

The output will be an array of the 9 images each of size (with/3, height/3)

</div
 
 
     
     
1
 
vote

После следующего изображения кода на основе параметров, добавления границ и отображений:

 <код> -(NSMutableArray *)getImagesFromImage:(UIImage *)image withRow:(NSInteger)rows           withColumn:(NSInteger)columns{   NSMutableArray *images = [NSMutableArray array];   CGSize imageSize = image.size;   CGFloat xPos = 0.0, yPos = 0.0;   CGFloat width = imageSize.width/rows;   CGFloat height = imageSize.height/columns;   for (int y = 0; y < columns; y++) {     xPos = 0.0;     for (int x = 0; x < rows; x++) {          CGRect rect = CGRectMake(xPos, yPos, width, height);         CGImageRef cImage = CGImageCreateWithImageInRect([image CGImage],  rect);          UIImage *dImage = [[UIImage alloc] initWithCGImage:cImage];         UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(x*width, y*height, width, height)];         [imageView setImage:dImage];         [imageView.layer setBorderColor:[[UIColor blackColor] CGColor]];         [imageView.layer setBorderWidth:1.0];         [self.view addSubview:imageView];         [images addObject:dImage];         xPos += width;     }     yPos += height; } return images; }   

Проект Скачать ссылку: https://github.com/bpolat/image-slicer

Использование образца и результат:

[Self GetImagesFromImimage: [Uiimage ImageNaMed: @ "1.png"] Усилия: 4 incolumn: 4];

Введите описание изображения здесь

 

Following code slice image based on parameters, add borders and displays:

-(NSMutableArray *)getImagesFromImage:(UIImage *)image withRow:(NSInteger)rows           withColumn:(NSInteger)columns{   NSMutableArray *images = [NSMutableArray array];   CGSize imageSize = image.size;   CGFloat xPos = 0.0, yPos = 0.0;   CGFloat width = imageSize.width/rows;   CGFloat height = imageSize.height/columns;   for (int y = 0; y < columns; y++) {     xPos = 0.0;     for (int x = 0; x < rows; x++) {          CGRect rect = CGRectMake(xPos, yPos, width, height);         CGImageRef cImage = CGImageCreateWithImageInRect([image CGImage],  rect);          UIImage *dImage = [[UIImage alloc] initWithCGImage:cImage];         UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(x*width, y*height, width, height)];         [imageView setImage:dImage];         [imageView.layer setBorderColor:[[UIColor blackColor] CGColor]];         [imageView.layer setBorderWidth:1.0];         [self.view addSubview:imageView];         [images addObject:dImage];         xPos += width;     }     yPos += height; } return images; } 

Project download link: https://github.com/bpolat/Image-Slicer

Sample Usage and Result:

[self getImagesFromImage:[UIImage imageNamed:@"1.png"] withRow:4 withColumn:4];

enter image description here

</div
 
 
 
 
0
 
vote

Если вы хотите, чтобы части изображения будут организованы, вам необходимо использовать какой-нибудь UiimageView в финальном представлении .. Просто посмотрите на этот код:

 <код>     UIImage* whole = [UIImage imageNamed:@"permanent_cosmetics_pretty.jpg"];     int partId = 0;          for (int x=0; x<=300; x+=100) {       for(int y=0; y<=300; y+=100) {           CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, 100, 100));         UIImage* part = [UIImage imageWithCGImage:cgImg];                    UIImageView* iv = [[UIImageView alloc] initWithImage:part];                                   switch (partId) {             case 0:                 self.part1.image=iv.image;                 break;             case 1:                 self.part2.image=iv.image;                 break;             case 2:                 self.part3.image=iv.image;                 break;             case 3:                 self.part4.image=iv.image;                 break;             case 4:                 self.part5.image=iv.image;                 break;             case 5:                 self.part6.image=iv.image;                 break;             case 6:                 self.part7.image=iv.image;                 break;             case 7:                 self.part8.image=iv.image;                 break;             case 8:                 self.part9.image=iv.image;                 break;             case 9:                 self.part10.image=iv.image;                 break;             case 10:                 self.part11.image=iv.image;                 break;             case 11:                 self.part12.image=iv.image;                 break;             default:                 break;         }                        [iv release];                        partId++;         NSLog(@"part id = %d",partId);         }    }    [self.view addSubview:self.finalView];       
 

If you want the parts of the image will be organized you need to use some UIImageView in the final view.. just take a look at this code :

    UIImage* whole = [UIImage imageNamed:@"permanent_cosmetics_pretty.jpg"];     int partId = 0;          for (int x=0; x<=300; x+=100) {       for(int y=0; y<=300; y+=100) {           CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, 100, 100));         UIImage* part = [UIImage imageWithCGImage:cgImg];                    UIImageView* iv = [[UIImageView alloc] initWithImage:part];                                   switch (partId) {             case 0:                 self.part1.image=iv.image;                 break;             case 1:                 self.part2.image=iv.image;                 break;             case 2:                 self.part3.image=iv.image;                 break;             case 3:                 self.part4.image=iv.image;                 break;             case 4:                 self.part5.image=iv.image;                 break;             case 5:                 self.part6.image=iv.image;                 break;             case 6:                 self.part7.image=iv.image;                 break;             case 7:                 self.part8.image=iv.image;                 break;             case 8:                 self.part9.image=iv.image;                 break;             case 9:                 self.part10.image=iv.image;                 break;             case 10:                 self.part11.image=iv.image;                 break;             case 11:                 self.part12.image=iv.image;                 break;             default:                 break;         }                        [iv release];                        partId++;         NSLog(@"part id = %d",partId);         }    }    [self.view addSubview:self.finalView];     
</div
 
 

Связанный проблема

0  Не можете получить панель поиска для отображения в приложении iPhone  ( Cant get search bar to display in iphone application ) 
Я пытаюсь получить панель поиска для отображения в моем приложении. Я следую в примере Show в приложении TableSearch Sample. Я более или менее реализован ...

1  Как я могу получить токен доступа через API FBConnect?  ( How can i get access token through fbconnect api ) 
Я хочу знать, смогу ли я получить токен доступа через API FBConnect, используя SDK iPhone. Я могу получить один через fbgraph, но я хочу использовать fbconn...

3  Как создать универсальные приложения на iPhone / iPad?  ( How to create universal apps in iphone ipad ) 
Я хочу создать универсальные приложения. Я уже сделал несколько приложений для iPhone. Теперь я хочу начать универсальные приложения, что означает, что прилож...

15  Как получить все записи NSFetchedResultScontroller / NsmanageObjectContext?  ( How to get all entries of a nsfetchedresultscontroller nsmanagedobjectcontext ) 
У меня есть хорошее рабочее приложение для iPhone, которое работает с основными данными. Я использую NSFetchedResultScontroller / NSManageObjectContext, как о...

0  Призматическое соединение вызывает сбой коробки2D (Cocos2D)  ( Prismatic joint causes a crash box2dcocos2d ) 
Я пытался настроить призматический сустав, но я получаю эту ошибку при выполнении времени: Ошибка утверждения: (заблокировано () == false), функциональная нас...

8  UIVIEW AUTOSESINGSMASK Проблема  ( Uiview autoresizingmask problem ) 
в iPad. У меня есть UiviewController с другим UIView внутри него, внизу. <код> ____________ | | | | | UIView | | Controller | | ...

57  Как динамически разместить высоту UiableViewCell  ( How to dynamically resize uitableviewcell height ) 
У меня есть классический сгруппированный UiableView с редактируемым UIrextViews внутри каждой ячейки. Этот текстовые представления могут быть одиночными или м...

1  Не удается изменить размер кадра UiscrollView  ( Cannot resize uiscrollviews frame ) 
У меня есть UiscrollView с его рамой и содержимым с таким же размером. Я хочу изменить высоту кадра ScrollView, когда появится клавиатура, но она не работает....

-1  Как я могу просмотреть накопительную кулачок в моем собственном приложении для iPhone и Android?  ( How can i view a drop cam feed in my own app for iphone and android ) 
У меня есть клиент, который хочет показать его подачу капюма в своем собственном приложении, а не приложение, которое предоставляет CAM. Однако после вызова D...

2  IPhone UiableView подавляет кнопку раскрытия, когда кнопка «Удаление» отображается  ( Iphone uitableview suppress disclosure button when delete button is displayed ) 
У меня есть <код> UITableView , который имеет кнопку раскрытия на каждой строке. Когда таблица введена в режим редактирования, и управление удалением нажата (...

2  Удаление разделов UiableView сочетается с пользовательскими заголовками раздела Uiviews = ошибка в коде Apple?  ( Deleting uitableview sections combined with custom section headers uiviews bug ) 
Я пытаюсь удалить раздел из UiableView с использованием анимации и пользовательской таблицы заголовка раздела UIViews. Я использую ... <код> //Deletion fr...

2  Делегат для объекта проходит к делегату  ( Delegate for object passes itself to delegate ) 
У меня есть подкласс UiimageView и хотел бы пройти как параметр к делегату. Я получаю ошибку «ожидаемую») «Перед MyImageView». Мне нужно пройти объект к делег...

4  Создайте каталог на iPhone  ( Create a directory on an iphone ) 
Я хочу знать, как создать каталог на указанном пути. Я использовал "систему (" путь каталога ");" Это работает нормально в симуляторе, но не на устройстве ...

0  вебсервис В Iphone SDK?  ( Webservice in iphone sdk ) 
<Р> я скачал WSDLObjC-0,6 от Google, чтобы включить SOAP веб-сервис в IPhone SDK.But это является, как App файл, как я могу интегрировать этот файл в iPhone SD...

1  Нужно, чтобы получить доступ к URL в моем одном представлении ИОС приложения с помощью веб-просмотра  ( Need to access the url in my single view ios application using web view ) 
<Р> У меня есть один вопрос относительно WebView. У меня есть URL-адрес, и нужно, чтобы запустить этот URL в WebView. и мой код здесь идет .. <код> NSLog(@"R...

Связанный проблема

0  Не можете получить панель поиска для отображения в приложении iPhone 
1  Как я могу получить токен доступа через API FBConnect? 
3  Как создать универсальные приложения на iPhone / iPad? 
15  Как получить все записи NSFetchedResultScontroller / NsmanageObjectContext? 
0  Призматическое соединение вызывает сбой коробки2D (Cocos2D) 
8  UIVIEW AUTOSESINGSMASK Проблема 
57  Как динамически разместить высоту UiableViewCell 
1  Не удается изменить размер кадра UiscrollView 
-1  Как я могу просмотреть накопительную кулачок в моем собственном приложении для iPhone и Android? 
2  IPhone UiableView подавляет кнопку раскрытия, когда кнопка «Удаление» отображается 
2  Удаление разделов UiableView сочетается с пользовательскими заголовками раздела Uiviews = ошибка в коде Apple? 
2  Делегат для объекта проходит к делегату 
4  Создайте каталог на iPhone 
0  вебсервис В Iphone SDK? 
1  Нужно, чтобы получить доступ к URL в моем одном представлении ИОС приложения с помощью веб-просмотра