Я знаю, что должен быть способ сделать одно базовое изображение (в моем случае прозрачным базовым слоем 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;
}
Вы получаете изображение 'UIGraphicsGetImageFromCurrentImageContext()', прежде чем нарисовать что-либо. Переместите этот вызов после вашего цикла и перед 'UIGraphicsEndImageContext()' –
Одна вещь, которую я заметил ... @ 3x бит меня. Я хотел получить окончательный холст 4096 независимо от масштаба экрана. Но причина в том, что такой монстр памяти как есть, так это то, что он сделал изображение 12288x12288 (я тестирую на iphone 6 плюс симулятор) ... :(О, хорошо. Мой плохой. Пол: Я попробую ваше предложение. ! – Jann
Пол, если вы поместите это в терминах «ответа» на вопрос, я приму это. Работал! Спасибо! (И МНОГО быстрее И память эффективна, чем попытка «drawImage», которую я пробовал). – Jann