在UIImage中更改JUST .scale?

时间:2016-11-06 17:39:53

标签: swift uiimage

在这里,我正在创建一个典型的图形(它是所有设备上的全屏尺寸)......

@Override 
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_ACCESS_LOCATION: { 
            // If request is cancelled, the result arrays are empty. 
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the 

            } else { 

               //user denied permission additionally you can check  
               //ActivityCompat.shouldShowRequestPermissionRationale if user checked on "do not show again" while clicking deny
            } 
            return; 
        } 

        // other 'case' lines to check for other 
        // permissions this app might request 
    } 
} 

我需要最终图片为func buildImage()->UIImage { let wrapperA:UIView = say, a picture let wrapperB:UIView = say, some text to go on top let mainSize = basicImage.bounds.size UIGraphicsBeginImageContextWithOptions(mainSize, false, 0.0) basicImage.drawHierarchy(in: basicImage.bounds, afterScreenUpdates:true) wrapperA.drawHierarchy(in: wrapperA.bounds, afterScreenUpdates:true) wrapperB.drawHierarchy(in: wrapperB.bounds, afterScreenUpdates: true) let result:UIImage? = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // so we've just created a nice big image for some reason, // no problem so far print( result?.scale ) // I want to change that image to have a scale of 1. // I don't know how to do that, so I actually just // make a new identical one, with scale of 1 let resultFixed:UIImage = UIImage(cgImage: result!.cgImage!, scale: 1.0, orientation: result!.imageOrientation) print( resultFixed.scale ) print("Let's use only '1-scale' images to upload to things like Instagram") // return result return resultFixed // be sure to ask on SO if there's a way to // just "change the scale" rather than make new. } 为1 - 但.scale是一个只读属性。

我唯一知道该怎么做的是制作一个全新的图像副本......但是在创建时将比例设置为1.

有更好的方法吗?

方便提示 -

这是出于以下动机:假设您将大图像保存到用户的相册中,并且还允许UIActivityViewController发布到(示例)Instagram。作为一般规则,似乎最好在发送到(示例)Instagram之前制作比例1;如果比例为3,那么你实际上只是在Instagram帖子上获得了左上角1/3的图像。在将其保存到iOS相册方面,将比例设置为1似乎无害(可能在某些方面更好)。(我只说“更好”,如果图像是,例如,最终说通过电子邮件发送给PC上的朋友,如果比例为1,则可以减少混淆。)有趣的是,如果您只是使用iOS相册,并拍摄2或3级图像,并将其分享到Instagram:事实上它确实如此在Instagram上正常显示! (也许Apple的照片确实知道在将其发送到像Instagram这样的地方之前,最好将其缩放为1!)。

1 个答案:

答案 0 :(得分:1)

正如您所说,scale的{​​{1}}属性是只读的 - 因此您无法直接更改它。

但是,使用UIImage的{​​{1}}初始化工具不会真正复制图片 - 它包装的基础UIImage(包含实际的位图)数据)仍然是同一个实例。它只是一个新的init(cgImage:scale:orientation)包装器。

尽管如此,在这种情况下,您可以通过直接通过CGImage的{​​{3}}方法从上下文中获取UIImage来剪切中间UIImage包装器。例如:

CGImage