2015-04-07 5 views
0

Я знаю, что должен быть способ сделать одно базовое изображение (в моем случае прозрачным базовым слоем 4096x4096) и добавить несколько десятков (до 100) очень маленьких (100x100) изображения в разных местах. НО я не могу понять, как это сделать: Предположим следующее, что imageArray имеет множество элементов, каждый из которых содержит NSDictionary со следующей структурой:Как добавить несколько UIImages в один базовый UIImage в iOS

@{ 
@"imagename":imagename, 
@"x":xYDict[@"x"], 
@"y":xYDict[@"y"] 
} 

Теперь, вот код (который не работает все, что я. есть является прозрачным экраном ... и производительность все еще ужасен ... около 1-2 секунд на «образ» в петле ... и массовое использование памяти.

NSString *PNGHeatMapPath = [[myGizmoClass dataDir] stringByAppendingPathComponent:@"HeatMap.png"]; 

     @autoreleasepool 
     { 
      CGSize theFinalImageSize = CGSizeMake(4096, 4096); 
      NSLog(@"populateHeatMapJSON: creating blank image"); 
      UIGraphicsBeginImageContextWithOptions(theFinalImageSize, NO, 0.0); 
      UIImage *theFinalImage = UIGraphicsGetImageFromCurrentImageContext(); 

      for (NSDictionary *theDict in imageArray) 
      { 
       NSLog(@"populateHeatMapJSON: adding: %@",theDict[@"imagename"]); 

       UIImage *image = [UIImage imageNamed:theDict[@"imagename"]]; 

       [image drawInRect:CGRectMake([theDict[@"x"] doubleValue],[theDict[@"y"] doubleValue],image.size.width,image.size.height)]; 

      } 
      UIGraphicsEndImageContext(); 


      NSData *imageData = UIImagePNGRepresentation(theFinalImage); 

      theFinalImage = nil; 

      [imageData writeToFile:PNGHeatMapPath atomically:YES]; 

      NSLog(@"populateHeatMapJSON: PNGHeatMapPath = %@",PNGHeatMapPath); 

     } 

Я знаю, что недопонимание UIGraphics контексты ... может кто-то помочь мне? Я пытаюсь наложить кучу UIImages на пустой прозрачный холст в определенных местах x, y, получить фину l и сохраните его.

PS: Это также .. если симулятор - это что-то, что нужно ... утечка, как черт. Он поднимается до 2 или 3 концертов ... Спасибо заранее.

EDIT: Я нашел это и попробовал, но он требует, чтобы я переписал все изображение, скопировал это изображение в новое и добавил к нему новое. Надеюсь на «базовое изображение», «добавьте это изображение», «добавьте это изображение», «добавьте другое изображение» и получите новое базовое изображение без копирования:

Как это хорошо?

+(UIImage*) drawImage:(UIImage*) fgImage 
      inImage:(UIImage*) bgImage 
      atPoint:(CGPoint) point 
{ 
UIGraphicsBeginImageContextWithOptions(bgImage.size, FALSE, 0.0); 
[bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)]; 
[fgImage drawInRect:CGRectMake(point.x, point.y, fgImage.size.width, fgImage.size.height)]; 
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return newImage; 
} 
+1

Вы получаете изображение 'UIGraphicsGetImageFromCurrentImageContext()', прежде чем нарисовать что-либо. Переместите этот вызов после вашего цикла и перед 'UIGraphicsEndImageContext()' –

+0

Одна вещь, которую я заметил ... @ 3x бит меня. Я хотел получить окончательный холст 4096 независимо от масштаба экрана. Но причина в том, что такой монстр памяти как есть, так это то, что он сделал изображение 12288x12288 (я тестирую на iphone 6 плюс симулятор) ... :(О, хорошо. Мой плохой. Пол: Я попробую ваше предложение. ! – Jann

+0

Пол, если вы поместите это в терминах «ответа» на вопрос, я приму это. Работал! Спасибо! (И МНОГО быстрее И память эффективна, чем попытка «drawImage», которую я пробовал). – Jann

ответ

1

Вы получаете изображение UIGraphicsGetImageFromCurrentImageContext(), прежде чем нарисовать что-нибудь. Переместить этот вызов после цикла и перед UIGraphicsEndImageContext()

Ваш рисунок на самом деле происходит на линии

[image drawInRect:CGRectMake([theDict[@"x"] doubleValue],[theDict[@"y"] doubleValue],image.size.width,image.size.height)]; 

функция UIGraphicsGetImageFromCurrentImageContext() дает изображение текущего содержимого контекста, так что вы должны убедиться, что вы сделали все ваши рисунки, прежде чем захватить изображение.

+0

Отличный ответ, Пол! Большое спасибо! – Jann

 Смежные вопросы

  • Нет связанных вопросов^_^