2017-02-20 4 views
0

iOS 10.2 swift 3.0UIImage créé n'apparaît pas comme je l'aurais prévu?

J'utilise ces routines pour couper, redimensionner et recombiner une image à afficher sur un AppleTV. Mais malgré le fait qu'il rapporte l'image comme la taille correcte, cela ne fonctionne pas comme je l'avais prévu/voulu.

Qu'est-ce qui me manque ici?

func cropImage(image: UIImage, newRect: CGRect) -> UIImage { 
    let img = CIImage(image: image)!.cropping(to: newRect) 
    let image = UIImage(ciImage: img, scale: 1.0, orientation: image.imageOrientation) 
    return image 
} 

func combine2LONGImage(imageUn: UIImage, imageDeux: UIImage) -> UIImage { 
    let size = CGSize(width: imageUn.size.width + imageDeux.size.width, height: imageUn.size.height) 
    UIGraphicsBeginImageContext(size) 
    imageUn.draw(in: CGRect(x: 0, y: 0, width: imageUn.size.width, height: imageUn.size.height)) 
    imageDeux.draw(in: CGRect(x: imageUn.size.width, y: 0, width: imageDeux.size.width, height: imageDeux.size.height)) 
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 
    return newImage 
} 


func resizeLONGImage(image: UIImage, newSize: CGSize) -> UIImage { 
    UIGraphicsBeginImageContext(newSize) 
    image.draw(in: CGRect(x:0, y:0, width: newSize.width, height: self.view.bounds.height)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage! 
} 

let leftSide = CGRect(x: 0, y: 0, width: (image2S?.size.width)!/2, height: self.view.bounds.height) 


let leftImage = self.cropImage(image: image2S!, newRect: leftSide) 
let rightSide = CGRect(x: (image2S?.size.width)!/2, y: 0, width: self.view.bounds.width, height: self.view.bounds.height) 

let rightImage = self.cropImage(image: image2S!, newRect: rightSide) 
      print("20022017 \(leftImage) \(rightImage)") 

let newLeftImage = self.resizeLONGImage(image: leftImage, newSize: CGSize(width: self.view.bounds.width, height: self.view.bounds.height)) 
let newRightImage = self.resizeLONGImage(image: rightImage, newSize: CGSize(width: self.view.bounds.width, height: self.view.bounds.height)) 
let superNewImage = self.combine2LONGImage(imageUn: newLeftImage, imageDeux: newRightImage) 
print("19022017 newimage \(self.image2P.bounds) \(leftImage.size.width) \(newLeftImage.size.height) \(superNewImage.size)") 



self.image2P.image = superNewImage 
self.image2P.contentMode = .left 
self.image2P.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height) 

l'image renvoyée est [est la taille correcte [deux fois plus longtemps que l'écran AppleTV, même hauteur] ... mais le contentMode me échoue, il redimensionne l'image, il semble qu'il convient à l'écran !!]. Je l'ai fait une photo et je suis arrivé ce ...

enter image description here

Oui, il est un 3 & 4, mais son identique au 1 & 2.

La console rapporte?

19022017 previewPane 1920.0 1080.0 1920.0 1080.0 
20022017 Optional(<UIImage: 0x60000009d9c0>, {1920, 768}) Optional(<UIImage: 0x60000009da10>, {1024, 768}) 
19022017 newimage (0.0, 0.0, 1920.0, 1080.0) 1920.0 1080.0 (3840.0, 1080.0) 

Le superNewImage est 3840 large et 1080 de haut, et je viens de justifier à gauche, mais que fait-il? Si je charge une image que j'ai créée avec Paint indique que la taille est la même et que je la montre à l'écran, cela fonctionne comme je l'aurais souhaité, moitié à l'écran, moitié à moitié.

L'image originale avec laquelle je commence est ici.

enter image description here

Ce que je cherche à faire est de montrer que le premier chiffre à l'écran afin que l'utilisateur de l'application peut faire défiler latéralement vers la seconde. Le défilement que j'ai eu, quelques réparations à faire. Et cela fonctionne si je télécharge une image prédéfinie avec la taille correcte [2 x largeur, même hauteur]. Mais si je télécharge une image qui est un sous-ensemble, essayez et recadrez + le combiner, non, cela ne fonctionne pas. Juste ajouté un morceau de code leftSide un autre whoops peut-être ... ne fonctionne toujours pas. La première image que je crée la taille exacte a travaillé, il ressemble à ceci ...

enter image description here

Voici l'original comme celui-ci ...

enter image description here

+1

ok - un peu peu clair ce que vous commencez, et ce que vous essayez de finir avec ... Pouvez-vous lier à votre image originale, et comment vous vous attendez à ce qu'il se termine? Et, je suppose que votre fonction 'cropImage()' est la même que 'self.chopImageFromRect()'? – DonMag

+1

hmmm ... votre image originale est '2048 x 768' oui? Voulez-vous que cette échelle non proportionnelle à «3840 x 1080»? Ou, voulez-vous proportionnellement à l'échelle de «2,880 x 1080», puis chaque moitié centrée horizontalement de chaque côté de l'image finale «3840 x 1080»? Ou, ne voulez-vous pas que l'image soit mise à l'échelle, mais centrez chaque moitié verticalement et horizontalement de chaque côté de l'image finale '3840 x 1080'? – DonMag

+0

Je souhaite que l'image soit mise à l'échelle afin qu'elle corresponde à l'AppleTV en tant que deux écrans AppleTV distincts. Donc une seule image qui est 3840 x 1080. Je veux que cette image apparaisse à l'écran comme si elle était seulement 1920 x 1080, donnant à l'utilisateur la possibilité de voir l'autre moitié à 1920 x 1080 en faisant défiler. Je prends le 2048 x 768, le hache en deux (1024 x 768) redimensionne les deux demi-tons puis les combine à un, finissant avec une image 3840 x 1080. Mais quand je le montre à l'écran, je vois les deux moitiés au en même temps, malgré l'utilisation d'un contentMode de = left. – user3069232

Répondre

1

Je pense que vous mélangez la taille de l'image , taille d'image désirée, l'écran/taille de vue ...

Essayez ceci dans un terrain de jeu ... J'ajouté votre 2048x768 "1 2" image nommée "orig2048x1024.png"

import UIKit 
import PlaygroundSupport 

var screenSize = CGSize(width: 1920, height: 1080) 

let containerView = UIView(frame: CGRect(x: 0, y: 0, width: screenSize.width, height: screenSize.height)) 
containerView.backgroundColor = UIColor.green 


func chopImageFromRect(image: UIImage, newRect: CGRect) -> UIImage { 
    let img = CIImage(image: image)!.cropping(to: newRect) 
    let image = UIImage(ciImage: img, scale: 1.0, orientation: image.imageOrientation) 
    return image 
} 

func combine2LONGImage(imageUn: UIImage, imageDeux: UIImage) -> UIImage { 

    let size = CGSize(width: imageUn.size.width + imageDeux.size.width, height: imageUn.size.height) 
    UIGraphicsBeginImageContext(size) 

    imageUn.draw(in: CGRect(x: 0, y: 0, width: imageUn.size.width, height: imageUn.size.height)) 

    imageDeux.draw(in: CGRect(x: imageUn.size.width, y: 0, width: imageDeux.size.width, height: imageDeux.size.height)) 


    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 
    return newImage 

} 

func resizeLONGImage(image: UIImage, newSize: CGSize) -> UIImage { 
    UIGraphicsBeginImageContext(newSize) 
    image.draw(in: CGRect(x:0, y:0, width: newSize.width, height: newSize.height)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage! 
} 


var finalImage: UIImage? 

// original image size is 2048 x 768 
let image2S = UIImage(named: "orig2048x768.png") 

// target image size should be 3840 x 1080 
let targetImageSize = CGSize(width: screenSize.width * 2.0, height: screenSize.height) 

if let sz = image2S?.size { 

    // get the left side - x: 0 y: 0/1024 x 768 - of image 
    let leftHalf = chopImageFromRect(image: image2S!, newRect: CGRect(x: 0, y: 0, width: sz.width/2, height: sz.height)) 

    // get the right side - x: 1024 y: 0/1024 x 768 - of image 
    let rightHalf = chopImageFromRect(image: image2S!, newRect: CGRect(x: sz.width/2, y: 0, width: sz.width/2, height: sz.height)) 

    // target size for each is Half of the Target Image Size (double the screen width x the screen height) 
    let targetHalfSize = CGSize(width: targetImageSize.width/2, height: targetImageSize.height) 

    // scale each half to targetHalfSize 
    let newLH = resizeLONGImage(image: leftHalf, newSize: targetHalfSize) 
    let newRH = resizeLONGImage(image: rightHalf, newSize: targetHalfSize) 

    // combine the two newly-scaled halfs 
    finalImage = combine2LONGImage(imageUn: newLH, imageDeux: newRH) 

    // create an UIImageView the same size as the screen 
    let imgView = UIImageView(frame: containerView.bounds) 

    // set contentMode to .left 
    imgView.contentMode = .left 

    // set the image of the image view 
    imgView.image = finalImage 

    // add the image view to the screen 
    containerView.addSubview(imgView) 

} 


PlaygroundPage.current.liveView = containerView 
PlaygroundPage.current.needsIndefiniteExecution = true 
+0

Oui, peut-être une erreur que je n'ai jamais repérée! MERCI!! Changé mais malheureusement ne l'a pas réparé. Mettra à jour le code de la question aussi !! – user3069232

+0

Attendez, je viens de voir une autre erreur dans le code; Je réutilisais l'image originale, j'ai changé cela, mais ce n'est toujours pas correct. Il a la hauteur correcte mais pas la largeur !! – user3069232

+1

Jetez un oeil à cela ... – DonMag