如何放大UIImage而不会使任何东西变模糊?

8

我希望以一种方式放大UIImage,使用户能够清晰地看到UIImage中的像素。当我将其放入UIImageView并缩放变换矩阵时,UIImage会出现抗锯齿和平滑处理。

是否有一种方法可以通过简单地重复每行和每列来在更大的位图上下文中呈现,从而获得更大的像素?我该怎么做?


你的缩放因子是多少?请记住,只有在x2、x3、x4等情况下,您才能期望获得“清晰”的结果。 - Eiko
1
请注意,此方法被称为最近邻插值。 - BoltClock
5个回答

24

#import <QuartzCore/CALayer.h>

view.layer.magnificationFilter = kCAFilterNearest

这段代码涉及到了CALayer的magnificationFilter属性,用于设置图层的放大过滤器。上述代码将放大过滤器设置为最近邻过滤器。

3
请注意,如果您是使用[UIImage imageWithCIImage:ci]创建了UIImageView的UIImage,则此方法不起作用。 - marcelnijman
3
另外,使用 view.layer.shouldRasterize = YES。这是为了避免出现某些图像每个像素显示4个像素的问题。 - Jeffrey Sun
@PeterDeWeese,这很好并且达到了我的目的,但我想问一下,当我使用magnificationFilter = kCAFilterNearest时,放大的大而锐利的像素是否真的是图像的原始像素,还是由某些处理产生的?谢谢! - Suge
@JeffreySun,当我使用shouldRasterize = YES时,像素看起来不像图像的原始像素,而是处理过的像素,我说得对吗? - Suge

2

Swift 5

let image = UIImage(named: "Foo")
let scaledImageSize = image.size.applying(CGAffineTransform(scaleX: 2, y: 2))

UIGraphicsBeginImageContext(scaledImageSize)
let scaledContext = UIGraphicsGetCurrentContext()!
scaledContext.interpolationQuality = .none
image.draw(in: CGRect(origin: .zero, size: scaledImageSize))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()!

这个解决方案仍然向输出中添加插值。如果尝试绘制清晰的彩色框,这会非常明显。 - Sentry.co

2

在直接绘制位图上下文时,我们可以使用以下方法:

CGContextSetInterpolationQuality(myBitmapContext, kCGInterpolationNone);

我在CGContextDrawImage很慢的iPhone 4上发现了这个问题。


1

我也试过在子层上尝试这个方法,但是无法生效,依然模糊。我需要做的是:

const CGFloat PIXEL_SCALE = 2;
layer.magnificationFilter = kCAFilterNearest; //Nearest neighbor texture filtering
layer.transform = CATransform3DMakeScale(PIXEL_SCALE, PIXEL_SCALE, 1); //Scale layer up
//Rasterize w/ sufficient resolution to show sharp pixels
layer.shouldRasterize = YES;
layer.rasterizationScale = PIXEL_SCALE;

谢谢你的恶意点踩...能否解释一下这个答案有什么问题? - Eliot

-1

对于从CIImage创建的UIImage,您可以使用以下代码:

imageView.image = UIImage(CIImage: ciImage.imageByApplyingTransform(CGAffineTransformMakeScale(kScale, kScale)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接