Созданный UIImage не выглядит так, как я ожидал?

iOS 10.2 swift 3.0

Я использую эти процедуры, чтобы вырезать, изменить размер и объединить изображение для отображения на AppleTV. Но, несмотря на то, что оно сообщает изображение как правильный размер, оно не работает так, как я ожидал / хотел.

Что я здесь пропустил?

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)

Возвращаемое изображение [имеет правильный размер [в два раза длиннее экрана AppleTV, такой же высоты] ... но contentMode мне не удается, он изменяет размер изображения, кажется, что он умещается на экране!!]. Я сделал снимок, и я получил это...

Да, это 3 и 4, но это так же, как 1 и 2.

Консоль сообщает?

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)

superNewImage имеет ширину 3840 и высоту 1080, и я сказал, что только что это оправдано, но что он делает?

Если я загружу изображение, созданное с помощью Paint, скажу, что оно того же размера, и покажу его на экране, оно будет работать, как я и ожидал, наполовину на экране, наполовину выключено.

Исходное изображение, с которого я начинаю, здесь.

То, что я хочу сделать, это показать только первую цифру на экране, чтобы пользователь приложения мог прокрутить вбок ко второй. Прокрутка у меня заработала, некоторые исправления надо делать. И это работает, если я загружаю предустановленное изображение с правильным размером [2 x ширина, такая же высота]. Но если я загружаю изображение, которое является подмножеством, попробуйте и обрежьте + объедините его, нет, это не работает.

Просто добавил фрагмент кода в левую сторону, возможно, еще один ой... все еще не работает. Первое изображение, которое я создал, работало в точном размере, похоже на это...

Оригинал выглядит так...

1 ответ

Решение

Я думаю, что вы смешиваете размер изображения, желаемый размер изображения, размер экрана / вида...

Попробуйте это на игровой площадке... Я добавил ваше 2048x768 "1 2" изображение с именем "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
Другие вопросы по тегам