2017-02-20 46 views
0

iOS 10.2 swift 3.0Созданный UIImage не появляется, как я ожидал?

Я использую эти процедуры для вырезания, изменения размера и рекомбинации изображения для отображения на 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 меня не подводит, она изменяет размер изображения, кажется, что он подходит на экране !!]. Я сделал снимок, и я получил это ...

enter image description here

Да, это 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, оно имеет одинаковый размер и показывает его на экране, он работает так, как я ожидал, наполовину на экране, наполовину выключен.

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

enter image description here

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

Только что добавил левый элемент кода, другой, возможно, ... все еще не работает. Первый образ, который я создал точный размер работал, это выглядит так ...

enter image description here

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

enter image description here

+1

ok - немного неясно, с чего начинаешься, и что вы пытаетесь в итоге ... Можете ли вы ссылаться на исходное изображение и как вы ожидаете его завершения? И, я полагаю, ваша функция 'cropImage()' такая же, как 'self.chopImageFromRect()'? – DonMag

+1

Хммм ... ваше оригинальное изображение - '2048 x 768' да? Вы хотите, чтобы это непропорционально масштабировалось до '3840 x 1080'? Или вы хотите, чтобы она пропорционально масштабировалась до «2880 x 1080», а затем каждая половина по центру была горизонтально в каждой части окончательного изображения «3840 x 1080»?Или вы не хотите масштабировать изображение, а вместо этого центрируете каждую половину вертикально и горизонтально в каждой части финального изображения «3840 x 1080»? – DonMag

+0

Я хочу, чтобы изображение масштабировалось так, чтобы оно соответствовало AppleTV как два отдельных экрана AppleTV. Таким образом, единственное изображение размером 3840 x 1080. Я хочу, чтобы это изображение появилось на экране первоначально, как будто оно всего лишь 1920 x 1080, что дает пользователю возможность увидеть вторую половину в 1920 x 1080, прокручивая ее. Я беру 2048 x 768, разделяю его на два (1024 x 768), изменяя размер двух половин, а затем объединяю их в один, заканчивая изображением 3840 x 1080. Но когда я показываю его на экране, я вижу обе половины на в то же время, несмотря на просто использование contentMode = left. – user3069232

ответ

1

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

Попробуйте это в Playground ... Я добавил свой 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 
+0

Да, может быть, ошибка, которую я никогда не видел! БЛАГОДАРЯ!! Изменил его, но, к сожалению, это не исправило. Будет также обновлен код вопроса !! – user3069232

+0

Подождите, я только что увидел еще одну ошибку в коде; Я повторно использовал оригинальный образ, изменил его, но его все еще не так. Он имеет правильную высоту, но не ширину! – user3069232

+1

Взгляните на это ... – DonMag

 Смежные вопросы

  • Нет связанных вопросов^_^