2013-08-16 7 views
15

Ciao Sto sviluppando l'applicazione che richiede di unire due immagini, Le mie dimensioni dell'immagine sono 320 * 240 unendo entrambe le immagini, voglio che la dimensione sia 320 * 480. Come posso farlo in modo programmatico Di seguito sono riportati i ImmaginiUnisci due immagini su un'immagine a livello di codice in iphone

First ImageSecond Image

==================================== =================================

enter image description here

+1

vuoi unirli o metterli uno sopra l'altro? – IronManGill

+0

Stai iniziando con due 'UIImmagine? –

+0

Voglio metterli uno sopra l'altro. Come ho mostrato due immagini Non voglio sovrapporre l'immagine, voglio coprire 488 altezza – krish

risposta

30

Proprio testato questo, creare il contesto in base alle dimensioni delle immagini che si sta lavorando e disegnare su uno sopra l'altro (questo presuppone che siano la stessa larghezza):

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]; 
+0

Grazie a questo ha funzionato per me .. – krish

+1

Stranamente, questo sembra degradare drammaticamente la qualità per me. Qualche idea del perché questo potrebbe essere? – Dinkman123

+1

Vedere la mia risposta qui sotto sulla qualità dell'immagine –

0
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(); 
0

penso che è necessario ottenere contesti di ypur immagini e poi marge esso.

UIImage *eyes = [UIImage imageNamed:@"eyes"]; 
    UIGraphicsBeginImageContext(CGSizeMake(m, n)); 
    CGContextRef context1 = UIGraphicsGetCurrentContext(); 

    UIImage *mouth = [UIImage imageNamed:@"mouth"]; 
    UIGraphicsBeginImageContext(CGSizeMake(m, n)); 
    CGContextRef context2 = UIGraphicsGetCurrentContext(); 

Merge disegnando contesto con diversi limiti

2

è possibile utilizzare due diverse immagini-vista una sotto other.and assegnare due immagini diverse.

13

Per evitare degradanti qualità dell'immagine, utilizzare UIGraphicsBeginImageContextWithOptions.

Se si specifica un valore di 0.0, il fattore di scala viene impostato sul fattore di scala della schermata principale del dispositivo.

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]; 
0
#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(); 
} 
+0

Potresti aggiungere ulteriori dettagli sulla tua soluzione? – abarisone

+0

due immagini si uniscono verticalmente, tutte le immagini di altezza larghezza che è possibile unire. –

5

Swift versione

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 
} 

Otterrete il vostro immagine di chiamare questa funzione come questa:

var myimage1 = UIImage(named: "image1.png") 
var myimage2 = UIImage(named: "image2.png") 

var finalMixedImage = getMixedImg(myimage1!, image2: myimage2!) 
+0

bel codice elegante - l'ho implementato in Swift 3 - vedi sotto - e fatto una funzione che ottiene un array invece di 1,2 immagini .... – nurxyz

0

Swift 3:

accetta un array immagini e restituisce un'immagine delle immagini una sopra l'altra prende dimensioni max in considerazione quindi è losless

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 
} 
0

Questa implementazione funziona per argomenti variadic, in modo da poter passare un illimitato numero di immagini da unire in verticale:

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() 
} 
0

// AGGIUNTO Swift 3.2 e 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)