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. }  

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

  • 相关阅读:
    QuartusII13.0使用教程详解(一个完整的工程建立)
    基于Vivado调用ROM IP core设计DDS
    FPGA学习之路——一路走来
    基于basys2用verilog设计多功能数字钟(重写)
    基于basys2驱动LCDQC12864B的verilog设计图片显示
    PWM(脉宽调制)——LED特效呼吸灯设计
    Isim你不得不知道的技巧(整理)
    ISE、vivado、QuartusII调用notepad++、UE汇总(整理)
    java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
    TCP/IP三次握手和HTTP过程
  • 原文地址:https://www.cnblogs.com/qiutangfengmian/p/5429949.html
Copyright © 2011-2022 走看看