zoukankan      html  css  js  c++  java
  • iOS 图片裁剪与修改

    最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解决问题,下面记录一下,以便帮助自己查找,也希望能帮助其他人。

    我们一般图片上传最好使用UIImageJPEGRepresentation(image, 0.1)这个方法先把图片处理一下,其实这个方法把图片压缩之后,图片大小会小很多(小多少待会再讲),但是在app上人眼的感觉差不多,我对图片的处理如下:

    从相册拿到图片后,先经过方法修改图片的大小,也就是分辨率,方法如下:

    - (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size
    {
        UIGraphicsBeginImageContextWithOptions(size,NO,0.0);
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return scaledImage;
    }

    因为我是要上传头像,所以我把图片的size设置为(128,128),这里我在模拟器中截取到了一个320*320的图片,然后经过这个方法压缩后得到的图片是20.3KB,然后我在上传之前又用UIImageJPEGRepresentation(image, 0.05)把图片品质压缩了一下,图片的大小变成了1.5KB左右,这样的小图,在app上加载起来快急了,之前那个七八十KB的图片经常都加载不出来呢,现在OK了~。

    总结:1、用 - (UIImage *)scaleImage:(UIImage *)image toSize:(CGSize)size 修改图片的分辨率;

      2、用 UIImageJPEGRepresentation(image,0.1)这个方法来压缩图片品质。

    其他补充,另一个方法UIImagePNGRepresentation(image),这个方法拿到的图片会比UIImageJPEGRepresentation(image,1.0)拿到的图片大一点,不知道为什么,欢迎其他人来补充。

    另一个裁剪图片的某部分区域的方法:

    - (UIImage *)croppedImage:(UIImage *)image
    
    {
        if (image)
        {
            CGRect rectMAX = CGRectMake(0, 0, 128, 128);
            
            CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, rectMAX);
            
            UIGraphicsBeginImageContext(rectMAX.size);
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGContextDrawImage(context, rectMAX, subImageRef);
            UIImage *viewImage = [UIImage imageWithCGImage:subImageRef];
            UIGraphicsEndImageContext();
            CGImageRelease(subImageRef);
            return viewImage;
        }
        
        return nil;
    
    }

    这个方法可以获取裁剪后的图片,举个例子,一个256*256的图片,用这个方法之后,就可以获取到左上角一个128*128区域的图片,具体裁剪哪里,可以修改上面rectMax的坐标和大小。

  • 相关阅读:
    【和我一起学习Unity3D】Unity3D的坐标控制
    android开发利器--站在巨人肩膀上前行
    Ubuntu输入password登陆后又跳回到登录界面
    Leetcode:Swap Nodes in Pairs 单链表相邻两节点逆置
    Android Home键监听
    Android 6.0 中TimePicker显示为滚动样式的方法
    Android Calendar的运用
    Android中Calendar类的用法总结
    Androlid入门之文件系统操作(三)文件读写
    Android入门之文件系统操作(二)文件操作相关指令
  • 原文地址:https://www.cnblogs.com/wanghang/p/6298909.html
Copyright © 2011-2022 走看看