Слияние двух изображений на одно изображение программно в iphone
Здравствуйте, я разрабатываю приложение, которое требует слияния двух изображений. Размер моего изображения составляет 320 * 240, объединив оба изображения. Я хочу, чтобы размер был 320 * 480. Как я могу сделать это программно. Ниже приведены изображения
![First Image]()
![Second Image]()
=============================================== ====================================
![enter image description here]()
Ответы
Ответ 1
Просто протестируйте это, создайте свой контекст на основе размеров изображений, с которыми вы работаете, и нарисуйте их друг над другом (это предполагает, что они имеют одинаковую ширину):
UIImage *image1 = [UIImage imageNamed:@"image1.png"];
UIImage *image2 = [UIImage imageNamed:@"image2.png"];
CGSize size = CGSizeMake(image1.size.width, image1.size.height + image2.size.height);
UIGraphicsBeginImageContext(size);
[image1 drawInRect:CGRectMake(0,0,size.width, image1.size.height)];
[image2 drawInRect:CGRectMake(0,image1.size.height,size.width, image2.size.height)];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Add image to view
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, finalImage.size.width, finalImage.size.height)];
imageView.image = finalImage;
[self.view addSubview:imageView];
Ответ 2
Чтобы избежать ухудшения качества изображения, используйте UIGraphicsBeginImageContextWithOptions.
Если вы укажете значение 0.0, масштабный коэффициент устанавливается на шкалу фактор главного экрана устройства.
UIImage *image1 = [UIImage imageNamed:@"image1.png"];
UIImage *image2 = [UIImage imageNamed:@"image2.png"];
CGSize size = CGSizeMake(image1.size.width, image1.size.height + image2.size.height);
UIGraphicsBeginImageContextWithOptions(size, false, 0.0) // Use this call
[image1 drawInRect:CGRectMake(0,0,size.width, image1.size.height)];
[image2 drawInRect:CGRectMake(0,image1.size.height,size.width, image2.size.height)];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Add image to view
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, finalImage.size.width, finalImage.size.height)];
imageView.image = finalImage;
[self.view addSubview:imageView];
Ответ 3
Быстрая версия
func getMixedImg(image1: UIImage, image2: UIImage) -> UIImage {
var size = CGSizeMake(image1.size.width, image1.size.height + image2.size.height)
UIGraphicsBeginImageContext(size)
image1.drawInRect(CGRectMake(0,0,size.width, image1.size.height))
image2.drawInRect(CGRectMake(0,image1.size.height,size.width, image2.size.height))
var finalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}
Вы получите изображение, чтобы вызвать эту функцию следующим образом:
var myimage1 = UIImage(named: "image1.png")
var myimage2 = UIImage(named: "image2.png")
var finalMixedImage = getMixedImg(myimage1!, image2: myimage2!)
Ответ 4
вы можете использовать два разных вида изображений один под другим. и назначить два разных изображения.
Ответ 5
UIImage *Image1 = [[UIImage alloc] initWithData:data];
UIImage *Image2 = [[UIImage alloc] initWithData:data];
// Set up width height with values.
CGSize newSize = CGSizeMake(width, height);
UIGraphicsBeginImageContext( newSize );
[Image1 drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
[Image2 drawInRect:CGRectMake(newSize.width,newSize.height,newSize.width,newSize.height*2) blendMode:kCGBlendModeNormal alpha:1.0];
UIImage *mergedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
Ответ 6
Я думаю, вы должны получить контексты изображений ypur, а затем перенести его.
UIImage *eyes = [UIImage imageNamed:@"eyes"];
UIGraphicsBeginImageContext(CGSizeMake(m, n));
CGContextRef context1 = UIGraphicsGetCurrentContext();
UIImage *mouth = [UIImage imageNamed:@"mouth"];
UIGraphicsBeginImageContext(CGSizeMake(m, n));
CGContextRef context2 = UIGraphicsGetCurrentContext();
Слияние путем рисования контекста с различными границами
Ответ 7
#pragma mark - merging two images
-(void)mergeimage :(UIImage*)firstImage withImage:(UIImage*)secondImage{
CGSize size = CGSizeMake(MAX(firstImage.size.width, secondImage.size.width), MAX(firstImage.size.height, secondImage.size.height));
UIGraphicsBeginImageContext(size);
[firstImage drawInRect:CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y,size.width/2,size.height)];
[secondImage drawInRect:CGRectMake(self.view.frame.origin.x+(size.width/2),self.view.frame.origin.y,size.width/2,size.height)];
UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
Ответ 8
Swift 3:
принимает массив изображений и возвращает изображение изображений один поверх другого
учитывает макс. размеры, поэтому он без потерь
func combineTopToBottom(imagesArray:[UIImage]) -> UIImage? {
var dimensions = CGSize(width: 0.0, height: 0.0)
for image in imagesArray {
dimensions.width = max(dimensions.width, image!.size.width)
dimensions.height += max(dimensions.height, image!.size.height)
}
UIGraphicsBeginImageContext(dimensions)
var lastY = CGFloat(0.0)
for image in imagesArray {
image?.draw(in:CGRect(x: 0, y: lastY, width: dimensions.width, height: image!.size.height))
lastY += image!.size.height
}
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return finalImage
}
Ответ 9
Эта реализация работает для вариативных аргументов, поэтому вы можете передавать неограниченное количество изображений для слияния по вертикали:
public static func mergeVertically(images: UIImage...) -> UIImage? {
let maxWidth = images.reduce(0.0) { max($0, $1.size.width) }
let totalHeight = images.reduce(0.0) { $0 + $1.size.height }
UIGraphicsBeginImageContextWithOptions(CGSize(width: maxWidth, height: totalHeight), false, 0.0)
defer {
UIGraphicsEndImageContext()
}
let _ = images.reduce(CGFloat(0.0)) {
$1.draw(in: CGRect(origin: CGPoint(x: 0.0, y: $0), size: $1.size))
return $0 + $1.size.height
}
return UIGraphicsGetImageFromCurrentImageContext()
}
Ответ 10
//ADDED Swift 3.2 и 4.0
@IBOutlet weak var imgCamera1: UIImageView!
@IBOutlet weak var imgCamera2: UIImageView!
let image1 = imgCamera1.image
let image2 = imgCamera2.image
let size = CGSize(width: image1?.size.width ?? 0.0, height: (image1?.size.height)! + (image2?.size.height)!)
UIGraphicsBeginImageContext(size)
image1?.draw(in: CGRect(x: 0, y: 0, width: size.width, height: image1?.size.height ?? 0.0))
image2?.draw(in: CGRect(x: 0, y: image1?.size.height ?? 0.0, width: size.width, height: image2?.size.height ?? 0.0))
let finalImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//Add image to view
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: finalImage?.size.width ?? 0.0, height: finalImage?.size.height ?? 0.0))
imageView.image = finalImage
//Displaying Image
// view.addSubview(imageView)