zoukankan      html  css  js  c++  java
  • iOS 压缩与裁剪图片问题

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

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

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

    //压缩图片  

    1. - (UIImage *)image:(UIImage*)image scaledToSize:(CGSize)newSize  
    2. {  
    3.     // Create a graphics image context  
    4.     UIGraphicsBeginImageContext(newSize);  
    5.     // Tell the old image to draw in this new context, with the desired  
    6.     // new size  
    7.     [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];  
    8.     // Get the new image from the context  
    9.     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();  
    10.     // End the context  
    11.     UIGraphicsEndImageContext();  
    12.     // Return the new image.  
    13.     return newImage;  
    14. }  

    上面方法的参数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) / 2, 0, newSize.width, newSize.height));  
    19.   
    20.     }  
    21.   
    22.     return [UIImage imageWithCGImage:imageRef];  
    23. }  

    结果表明方法二效果更好。

  • 相关阅读:
    ArrayList removeRange方法分析
    LinkedHashMap源码分析(基于JDK1.6)
    LinkedList原码分析(基于JDK1.6)
    TreeMap源码分析——深入分析(基于JDK1.6)
    51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划
    51 NOD 1049 最大子段和 动态规划 模板 板子 DP
    51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子
    8月20日 训练日记
    CodeForces
    CodeForces
  • 原文地址:https://www.cnblogs.com/qiutangfengmian/p/5429949.html
Copyright © 2011-2022 走看看