图像在 UIImageView 中显示模糊

Posted

技术标签:

【中文标题】图像在 UIImageView 中显示模糊【英文标题】:Image shows up blurred in UIImageView 【发布时间】:2012-04-18 22:00:32 【问题描述】:

我正在创建一个应用程序,用户可以在其中将他们的日程表加载到应用程序中,然后显示。

当允许在加载前编辑图像时,它会完美显示:

一旦用户“选择”了图像,它就会显示在 UIImageView 模糊中:

这里稍微放大:

我知道图像分辨率还可以,因为图像可以预先完美显示。 我怎样才能阻止它变得模糊?

我正在使用在UIScrollView 中缩放UIImageView 的基本方法。

这是我用来分配图像的代码。 zoomscroll 是UIScrollView,myschedule 是UIImageView

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
[self dismissModalViewControllerAnimated:YES];

//Obtaining saving path
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *imagePath = [documentsDirectory stringByAppendingPathComponent:@"myschedule.png"];

//Extracting image from the picker and saving it
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];   
if ([mediaType isEqualToString:@"public.image"])
    UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
    NSData *webData = UIImagePNGRepresentation(editedImage);
    [webData writeToFile:imagePath atomically:YES];

    myschedule.image = editedImage;

    [zoomscroll addSubview:myschedule];
    zoomscroll.contentSize = CGSizeMake(myschedule.frame.size.width , myschedule.frame.size.height);
    zoomscroll.minimumZoomScale = 1.0;
    zoomscroll.maximumZoomScale = 4.0;


谢谢!

【问题讨论】:

当用户选择图片时会发生什么(代码)?您是重新设置图像视图的图像还是更改图像视图的某些属性? 代码已添加!不过我觉得没有问题 您是否尝试过使用 PDF 查看器而不是 imageView。问题是当您缩放时,imageview 不会以更高的分辨率重新绘制自己。 您可能会遇到与视网膜和非视网膜缩放相关的问题。您是否在视网膜环境中看到这些问题,如果您切换到非视网膜,您还会看到它们吗? 【参考方案1】:

ios 在缩放视图时不会重绘视图,它只是向上或向下缩放视图。底层实现基本上是一个带纹理的 OpenGL 多边形,这就是缩放如此之快的原因。以更高的分辨率重新生成纹理很慢,因此 iOS 不会这样做,除非您明确告诉它这样做。

有多种方法可以解决此问题。最简单的可能是将滚动视图的 contentSize 设置为图像的实际大小,然后最初缩小,这样用户就不会将图像的小版本放大到 400%(这会导致模糊),而是缩小从 25% 到 100%。像这样的:

myschedule.image = editedImage;
myschedule.frame = CGRectMake(0, 0, editedImage.size.width, editedImage.size.height);

[zoomscroll addSubview:myschedule];
zoomscroll.contentSize = editedImage.size;
zoomscroll.minimumZoomScale = 0.25;
zoomscroll.maximumZoomScale = 1.0;
zoomscroll.zoomScale = zoomscroll.minimumZoomScale;

【讨论】:

我直接把这个复制到我的app里了,好像没有什么区别。如何告诉 iOS 重绘图像? 其实我错过了使用图片选择器中的editedImage的部分。您是否检查了保存在 imagePath 的文件并确认它实际上具有原始的完整分辨率并且没有模糊?也许问题根本不在于缩放。 或者,换一种说法,尝试记录editedImage的宽度/高度——它至少是1280像素宽吗?因为如果不是,则无法将其缩放 400% ( 4 * 320) 而不会变得模糊。 嘿,好点。即使在缩放之前,图像也很模糊。如何检查编辑后的图像是否具有原始图像的所有分辨率? 您可以将editedImage.size.width与UIImagePickerControllerOriginalImage返回的图像的size.width进行比较,尽管我在***上看到一些帖子表明UIImagePickerControllerOriginalImage并不总是返回原始图像要么。

以上是关于图像在 UIImageView 中显示模糊的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中设置模糊的图像背景[关闭]

在具有透明度的 UITableView 单元格中更新 UIImageView

在 UITableView iPhone 中显示 MySQL 数据库中的图像

根据变量使用不同的图像初始化 UIImageView

如何在应用模糊的情况下交叉淡化 UIImageView 的图像

如何使用 Swift 模糊 UIImageView 中的现有图像?