Как «свести» несколько UIImageViews в ОДИН?
-
12-09-2019 - |
Вопрос
У меня такое ощущение, что это непростая задача, но мне нужно объединить или сгладить UIImageView с другим представлением UIImage, лежащим над ним.Например:У меня есть два UIImageViews.У одного из них есть UIImage травянистого поля (1200 x 1200 пикселей).Другой — это UIImage баскетбольного мяча (128 x 128 пикселей), расположенный над изображением поля с травой таким образом, что кажется, что баскетбольный мяч находится на поле с травой.Я хочу иметь возможность СОХРАНИТЬ наложенные UIImageViews как один файл изображения в моем фотоальбоме, а это означает, что мне нужно будет каким-то образом объединить два изображения.Как это будет достигнуто?(ПРИМЕЧАНИЕ:Создание снимка экрана (320 x 480 пикселей) не является приемлемым решением, поскольку я хочу сохранить размер 1200 x 1600 пикселей.
ВОПРОС:
Как я могу объединить несколько UIImageViews в один и СОХРАНИТЬ полученное изображение, сохранив при этом размер/разрешение.
Решение
Это принимает любое представление и создает из него UIImage.Любое представление и его подпредставления будут «сведены» в UIImage, который вы сможете отобразить или сохранить на диск.
- (UIImage*)imageFromView{
UIImage *image;
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Другие советы
Почему бы вам просто не нарисовать исходные изображения UIImage друг над другом в фоновом буфере, а затем записать объединенное изображение в файл?Ниже приведен пример того, как вы можете нарисовать два изображения в одном буфере:
CGImageRef bgimage = [bguiimage CGImage];
width = CGImageGetWidth(bgimage);
height = CGImageGetHeight(bgimage);
// Create a temporary texture data buffer
GLUbyte* data = (GLubyte *) malloc(width * height * 4);
assert(data);
// Draw image to buffer
CGContextRef ctx = CGBitmapContextCreate(data, width, height, 8, width * 4, CGImageGetColorSpace(image), kCGImageAlphaPremultipliedLast);
assert(ctx);
// Flip image upside-down because OpenGL coordinates differ
CGContextTranslateCTM(ctx, 0, height);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextDrawImage(ctx, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), bgimage);
CGImageRef ballimage = [balluiimage CGImage];
bwidth = CGImageGetWidth(ballimage);
bheight = CGImageGetHeight(ballimage);
float x = (width - bwidth) / 2.0;
float y = (height - bheight) / 2.0;
CGContextDrawImage(ctx, CGRectMake(x, y, (CGFloat)bwidth, (CGFloat)bheight), ballimage);
CGContextRelease(ctx);