2015-04-07 66 views
0

我知道必須有一種方法來獲取一個基本圖像(在我的情況下是透明的4096x4096基本層)並添加幾十個(最多100個)非常小(100x100 )圖像在不同的位置。但我無法弄清楚如何做到這一點:假設以下是imageArray有很多元素,每個包含的NSDictionary結構如下:如何在iOS中的一個基本UIImage中添加多個UIImage

@{ 
@"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上下文...有人可以幫我嗎?我試圖在一些x,y位置的空白透明畫布上疊加一堆UIImage,得到fina l圖像並保存。

PS:這也是..如果模擬器是任何東西...泄漏就像heck。它上升到2或3演出... 在此先感謝。

編輯: 我沒有找到這個,並嘗試過它,但它需要我重寫整個圖像,將該圖像複製到一個新的圖像,並添加到新的。希望獲得「基本圖像」,「添加此圖像」,「添加該圖像」,「添加其他圖像」,並獲得新的基本圖像,而不需要全部複製:

這樣就好嗎?

+(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