首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CGContext调整UIImage的大小会使我的图像变得柔和,但像素密度不正确

使用CGContext调整UIImage的大小会使我的图像变得柔和,但像素密度不正确
EN

Stack Overflow用户
提问于 2016-08-20 09:34:45
回答 1查看 510关注 0票数 0

我正在构建一个图像管理器类,用于处理UIImages的大小调整、裁剪等操作。我之所以使用CGContext,是因为它的速度可以与这里的http://nshipster.com/image-resizing/基准测试中的UIGraphicsContext相媲美。

这是我的经理类:

代码语言:javascript
复制
func resizeImage(exportedWidth width: Int, exportedHeight height: Int, originalImage image: UIImage) -> UIImage? {
    let cgImage = image.CGImage

    let width = width
    let height = height
    let bitsPerComponent = CGImageGetBitsPerComponent(cgImage)
    let bytesPerRow = CGImageGetBytesPerRow(cgImage)
    let colorSpace = CGImageGetColorSpace(cgImage)
    let bitmapInfo = CGImageGetBitmapInfo(cgImage)

    let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo.rawValue)

    CGContextSetInterpolationQuality(context, .High)

    CGContextDrawImage(context, CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(width), height: CGFloat(height))), cgImage)

    let scaledImage = CGBitmapContextCreateImage(context).flatMap { UIImage(CGImage: $0) }

    return scaledImage
}

没什么特别疯狂的,但是当我把它添加到一个子类的UITextView中时,我遇到了麻烦。我试过将图像大小加倍,然后用UIImageView压缩它,但没有效果。这段代码以正确的大小正确地显示了它,但在我的iPhone SE上,图像像素与屏幕像素的比例似乎是1:1,而不是理想的2:1。

代码语言:javascript
复制
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        let textViewWidth: CGFloat = self.view.frame.size.width - 130
        let percentResize = textViewWidth / pickedImage.size.width
        let toBeExportedHeight = pickedImage.size.height * percentResize
        let resizedImage = ImageManipulationManager.sharedInstance.resizeImage(exportedWidth: Int(textViewWidth),exportedHeight: Int(toBeExportedHeight), originalImage: pickedImage)

        let attachment = NSTextAttachment()
        attachment.image = resizedImage
        let attString = NSAttributedString(attachment: attachment)
        textView.textStorage.insertAttributedString(attString, atIndex: textView.selectedRange.location)
        textInputbar.layoutIfNeeded()
        textView.becomeFirstResponder()
        print(textView.text.characters.count)
    }
    dismissViewControllerAnimated(true, completion: nil)
}
EN

回答 1

Stack Overflow用户

发布于 2016-08-20 10:31:26

双分辨率屏幕的图像必须是双分辨率的。这意味着它应该是所需实际大小的两倍宽和两倍,并在从CGImage派生时将scale附加到UIImage。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39049661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档