图片失真问题的解决方式


    我们假设要在截图中的举行图片展示区显示图片,由于原图片的宽高比例与图片显示窗口的宽高比例不一定相同,所以,直接将图片扔进去会改变图片的宽高比例,展示效果不好。

    这时你可能想到设置UIImageView的属性 _imageView.contentMode = UIViewContentModeCenter;  设置该属性后,我们会发现图片的宽高比例确实正确了,但是窗口中只显示了图片的一部分,这说明图片整体尺寸没有压缩,按照原图进行显示了。怎样才能达到既缩小图片又不改变原来的宽高比例呢?

    方法一:将图片按照原来的宽高比例压缩到与窗口合适的大小,然后在设置了_imageView.contentMode = UIViewContentModeCenter;  这个属性的UIImageView中展示压缩后的图片。

  1. //压缩图片  
  2. - (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize  
  3. {  
  4.     // Create a graphics image context  
  5.     UIGraphicsBeginImageContext(newSize);  
  6.     // Tell the old image to draw in this new context, with the desired  
  7.     // new size  
  8.     [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];  
  9.     // Get the new image from the context  
  10.     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();  
  11.     // End the context  
  12.     UIGraphicsEndImageContext();  
  13.     // Return the new image.  
  14.     return newImage;  
  15. }  
上面方法的参数newSize是和图片显示窗口差不多大的,结果出现了原图清晰,但压缩后图片不清晰的情况。


    方法二:按照窗口宽高比例,将原图横向或者纵向裁剪掉多余的部分,然后不设置UIImageView的contentMode属性,将裁剪后的图片送进去,使其自动适应窗口。

  1. //裁剪图片  
  2. - (UIImage *)cutImage:(UIImage*)image  
  3. {  
  4.     //压缩图片  
  5.     CGSize newSize;  
  6.     CGImageRef imageRef = nil;  
  7.       
  8.     if ((image.size.width / image.size.height) < (_headerView.bgImgView.size.width / _headerView.bgImgView.size.height)) {  
  9.         newSize.width = image.size.width;  
  10.         newSize.height = image.size.width * _headerView.bgImgView.size.height / _headerView.bgImgView.size.width;  
  11.           
  12.         imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(0, fabs(image.size.height - newSize.height) / 2, newSize.width, newSize.height));  
  13.           
  14.     } else {  
  15.         newSize.height = image.size.height;  
  16.         newSize.width = image.size.height * _headerView.bgImgView.size.width / _headerView.bgImgView.size.height;  
  17.           
  18.         imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectMake(fabs(image.size.width - newSize.width) / 20, newSize.width, newSize.height));  
  19.   
  20.     }  
  21.   
  22.     return [UIImage imageWithCGImage:imageRef];  
  23. }  
结果表明方法二效果更好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值