it-swarm.com.de

Wie verschmelzen zwei UIImages?

Ich versuche, zwei verschiedene Bilder zusammenzuführen und ein neues zu erstellen. So möchte ich das machen: Ich habe dieses Bild (A):  polaroid

Es ist ein PNG-Bild, und ich möchte dieses Bild mit einem anderen Bild (B) zusammenführen, das ich aus dem Telefon genommen habe, um Folgendes zu erstellen:  polaroid merged

Ich brauche eine Funktion, die A mit B zusammenführt und C erstellt. Die Größe muss aus dem A-Bild bestehen, und das Bild B sollte die Größe automatisch anpassen, damit es in das Polaroid (A) passt. Kann man das machen? Danke für deine Hilfe!

UPDATE Nur eine Sache, das Bild (A) ist ein Quadrat und das Bild, das ich aufgenommen habe, ist ein 16: 9. Wie kann ich das beheben? Wenn ich Ihre Funktion verwende, wird das Bild (B), das ich aufgenommen habe, gestreckt!

27
Luca Alberto

Hoffe das kann dir helfen,

var bottomImage = UIImage(named: "bottom.png")
var topImage = UIImage(named: "top.png")

var size = CGSize(width: 300, height: 300)
UIGraphicsBeginImageContext(size)

let areaSize = CGRect(x: 0, y: 0, width: size.width, height: size.height)
bottomImage!.draw(in: areaSize)

topImage!.draw(in: areaSize, blendMode: .normal, alpha: 0.8)

var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()

Alles Gute :)

66
Pallavi Konda

Auf diese Weise wird das Überlagerungsbild viel sauberer

class func mergeImages(imageView: UIImageView) -> UIImage {
 UIGraphicsBeginImageContextWithOptions(imageView.frame.size, false, 0.0) 
 imageView.superview!.layer.renderInContext(UIGraphicsGetCurrentContext()!)
 let image = UIGraphicsGetImageFromCurrentImageContext()
 UIGraphicsEndImageContext()

 return image 
}

 enter image description here

13
Svitlana

Swift 4 UIImage-Erweiterung, die das einfache Zusammenfügen/Überlagern von Bildern ermöglicht.

extension UIImage { 

  func overlayWith(image: UIImage, posX: CGFloat, posY: CGFloat) -> UIImage {
    let newWidth = size.width < posX + image.size.width ? posX + image.size.width : size.width
    let newHeight = size.height < posY + image.size.height ? posY + image.size.height : size.height
    let newSize = CGSize(width: newWidth, height: newHeight)

    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    draw(in: CGRect(Origin: CGPoint.zero, size: size))
    image.draw(in: CGRect(Origin: CGPoint(x: posX, y: posY), size: image.size))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
  }

}
8
budidino

Leicht modifizierte Version der Antwort von Budidino. Diese Implementierung behandelt auch negative posX und posY korrekt.

extension UIImage {
    func overlayWith(image: UIImage, posX: CGFloat, posY: CGFloat) -> UIImage {
        let newWidth = posX < 0 ? abs(posX) + max(self.size.width, image.size.width) :
            size.width < posX + image.size.width ? posX + image.size.width : size.width
        let newHeight = posY < 0 ? abs(posY) + max(size.height, image.size.height) :
            size.height < posY + image.size.height ? posY + image.size.height : size.height
        let newSize = CGSize(width: newWidth, height: newHeight)

        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        let originalPoint = CGPoint(x: posX < 0 ? abs(posX) : 0, y: posY < 0 ? abs(posY) : 0)
        self.draw(in: CGRect(Origin: originalPoint, size: self.size))
        let overLayPoint = CGPoint(x: posX < 0 ? 0 : posX, y: posY < 0 ? 0 : posY)
        image.draw(in: CGRect(Origin: overLayPoint, size: image.size))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        return newImage
    }
}
1
GOR
    let imagePickerController = UIImagePickerController()
    imagePickerController.delegate = self
    let actionSheet = UIAlertController(title: "Photo Source", 
    message:  "Choose a source", preferredStyle: .actionSheet)
    actionSheet.addAction(UIAlertAction(title: "Camera", 
       style:.default, handler: {(action: UIAlertAction)in
        if UIImagePickerController.isSourceTypeAvailable(.camera){
            imagePickerController.sourceType = .camera
            self.present(imagePickerController, 
            animated: true,completion: nil)
        }
        else{
            print("camera is not available")
        }  
    }))
    actionSheet.addAction(UIAlertAction(title: "Photo Library", 
                      style:.default, handler: {(action: UIAlertAction)in
        imagePickerController.sourceType = .photoLibrary
        self.present(imagePickerController, animated: true,
                                        completion: nil)

    }))
    actionSheet.addAction(UIAlertAction(title: "Cancle", 
     style: .cancel, handler: nil))
    self.present(actionSheet, animated: true, completion: nil)

  func imagePickerController(_ picker:UIImagePickerController,       
             didFinishPickingMediaWithInfo info: [String : Any]) 
   {
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage
    myImage.image = image
    picker.dismiss(animated: true, completion: nil)
   }
 func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
     }
1

Ziel-C-Version dieser Lösung mit umgedrehter Logik des obersten Bildes:

-(UIImage *)getImageInclosedWithinAnotherImage
{
    float innerImageSize = 20;
    UIImage *finalImage;

    UIImage *outerImage = [UIImage imageNamed:@"OuterImage.png"];
    UIImage *innerImage = [UIImage imageNamed:@"InnerImage.png"];

    CGSize outerImageSize = CGSizeMake(40, 40); // Provide custom size or size of your actual image
    UIGraphicsBeginImageContext(outerImageSize);

    //calculate areaSize for re-centered inner image
    CGRect areSize = CGRectMake(((outerImageSize.width/2) - (innerImageSize/2)), ((outerImageSize.width/2) - (innerImageSize/2)), innerImageSize, innerImageSize);
    [outerImage drawInRect:CGRectMake(0, 0, outerImageSize.width, outerImageSize.height)];
    [innerImage drawInRect:areSize blendMode:kCGBlendModeNormal alpha:1.0];

    finalImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return finalImage;
}
0
iLearner

Die angehobene Antwort erstreckt sich das Hintergrundbild ändert das Verhältnis. Die Lösung unten behebt das Problem, indem das Bild aus einer UIView gerendert wird, die die beiden Bildansichten als Unteransichten enthält.

ANTWORT, AN DER SIE SUCHEN (Swift 4):

func blendImages(_ img: UIImage,_ imgTwo: UIImage) -> Data? {
    let bottomImage = img
    let topImage = imgTwo

    let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: 306, height: 306))
    let imgView2 = UIImageView(frame: CGRect(x: 0, y: 0, width: 306, height: 306))

    // - Set Content mode to what you desire
    imgView.contentMode = .scaleAspectFill
    imgView2.contentMode = .scaleAspectFit

    // - Set Images
    imgView.image = bottomImage
    imgView2.image = topImage

    // - Create UIView
    let contentView = UIView(frame: CGRect(x: 0, y: 0, width: 306, height: 306))
    contentView.addSubview(imgView)
    contentView.addSubview(imgView2)

    // - Set Size
    let size = CGSize(width: 306, height: 306)

    // - Where the magic happens
    UIGraphicsBeginImageContextWithOptions(size, true, 0)

    contentView.drawHierarchy(in: contentView.bounds, afterScreenUpdates: true)

    guard let i = UIGraphicsGetImageFromCurrentImageContext(),
        let data = UIImageJPEGRepresentation(i, 1.0)
        else {return nil}

    UIGraphicsEndImageContext()

    return data
}

Die zurückgegebenen Bilddaten verdoppeln die Größe des Bildes, stellen Sie also die Größe der Ansichten auf die Hälfte der gewünschten Größe ein.

  • BEISPIEL: Ich wollte, dass die Breite und Höhe des Bildes 612 ist, und ich habe die Breite und Höhe der Ansichtsrahmen auf 306 ) // Viel Spaß :) festgelegt.
0
Milez