2

我在 UIImageView 中显示的 UIImage 遇到了一个奇怪的问题。

如果我将 1024x1024 图像放在 173x173 图像视图中并设置“缩放填充”,则结果会出现锯齿。但是,如果我放入相同的图像,然后截取 imageview 的屏幕截图并将其分配回去,图像就会完美显示。这让我很困扰,因为屏幕截图应该是我在图像视图中看到的确切像素。

左边是直接分配图像的结果。右侧是对同一图像进行截图并将其分配回去。请注意 Es 在左侧是锯齿状的,但在右侧是平滑的。

在此处输入图像描述

这是图像视图的内容模式的问题还是在截图过程中发生的事情?

    for(UIImageView* placeholderView in self.placeholderImageViews)
    {
//assigning a 1024x1024 image into a smaller image view results in an aliased image here
        placeholderView.image = imageToDisplay;

//this code makes the image appear perfectly scaled down
        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
        {
            UIGraphicsBeginImageContextWithOptions(placeholderView.frame.size, NO, [UIScreen mainScreen].scale);
        }
        else
        {
            UIGraphicsBeginImageContext(placeholderView.frame.size);
        }
        [placeholderView.layer renderInContext:UIGraphicsGetCurrentContext()];
        screenshot = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        //save the result
        placeholderView.image = screenshot;

    }
4

1 回答 1

0

UIImageView 缩放很烂;你应该总是给它一个与其边界大小完全相同的图像,所以它不必缩小它。检查此代码和示例。

快速扩展:

extension UIImage{

        // returns a scaled version of the image
        func imageScaledToSize(size : CGSize, isOpaque : Bool) -> UIImage{

            // begin a context of the desired size
            UIGraphicsBeginImageContextWithOptions(size, isOpaque, 0.0)

            // draw image in the rect with zero origin and size of the context
            let imageRect = CGRect(origin: CGPointZero, size: size)
            self.drawInRect(imageRect)

            // get the scaled image, close the context and return the image
            let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()

            return scaledImage
       }
}

例子:

aUIImageView.image = aUIImage.imageScaledToSize(aUIImageView.bounds.size, isOpaque : false)

如果图像没有 alpha,则将 isOpaque 设置为 true:绘图将具有更好的性能。

于 2015-06-17T14:31:05.800 回答