2013-08-16 11 views
15

Witam Pracuję nad aplikacją, która wymaga scalenia dwóch obrazów, mój rozmiar obrazu to 320 * 240 poprzez scalenie obu obrazów. Chcę mieć rozmiar 320 * 480. Jak mogę to zrobić programowo? Poniżej znajdują się obrazyScalanie dwóch obrazów do jednego obrazu programowo w iphone

First ImageSecond Image

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

enter image description here

+1

chcesz je scalić lub umieścić nad sobą? – IronManGill

+0

Czy zaczynasz od dwóch "UIImage's? –

+0

Chcę umieścić je nad sobą. Ponieważ wyświetlałem dwa obrazy, nie chcę nakładać się na obraz, chcę pokryć 488 wysokości – krish

Odpowiedz

30

Wystarczy przetestowane, stwórz kontekst na podstawie rozmiarów obrazy, które pracują z i wyciągnąć je na szczycie siebie (zakładając, że są tej samej szerokości):

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

Dzięki temu zadziałało dla mnie .. – krish

+1

Dziwne, to wydaje się dramatycznie pogarszać jakość dla mnie. Jakieś pomysły, dlaczego tak się dzieje? – Dinkman123

+1

Zobacz poniżej moją odpowiedź na temat jakości obrazu –

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

myślę, że trzeba dostać konteksty ypur obrazów, a następnie marge go.

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 czerpiąc z różnych kontekst granic

2

można użyć dwóch różnych obrazów widoki jeden poniżej other.and przypisać dwa różne obrazy.

13

Aby uniknąć poniżającego jakość obrazu, użyj UIGraphicsBeginImageContextWithOptions.

Jeżeli określono wartość 0,0, współczynnik skali jest ustawiony na skalę czynnika głównego ekranu urządzenia.

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

Czy możesz dodać więcej szczegółów na temat swojego rozwiązania? – abarisone

+0

dwa obrazy scalają się w pionie, a obrazy o dowolnej szerokości na szerokość można scalić. –

5

Swift Wersja

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 
} 

Dostaniesz swój wizerunek, aby wywołać tę funkcję tak:

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

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

fajny elegancki kod - zaimplementowałem go w Swift 3 - patrz niżej - i stworzyłem funkcję, która pobiera tablicę zamiast 1,2 obrazu .... – nurxyz

0

Swift 3:

akceptuje tablicę obrazów i zwraca obraz obrazów jeden na drugim trwa max rozmiary pod uwagę dlatego 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

Implementacja ta działa dla zmiennej liczbie argumentów argumentów, więc można przejść nieograniczona liczba obrazów do łączenia w pionie:

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

// DODATKOWA Swift 3.2 i 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)