V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
zioc
V2EX  ›  iDev

iOS 图片压缩有什么好方法?

  •  
  •   zioc · 2015-09-06 17:05:52 +08:00 · 6588 次点击
    这是一个创建于 3366 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求是压到 100kb 以下

    UIImageJPEGRepresentation 这个无法满足需求
    11 条回复    2015-09-07 18:21:58 +08:00
    haosxianr
        1
    haosxianr  
       2015-09-06 17:26:54 +08:00 via iPhone
    用 CoreImage 把图片尺寸调低试试
    sfz97308
        2
    sfz97308  
       2015-09-06 18:11:24 +08:00   ❤️ 1
    这种需求,直接打回去不给做。不谈图片分辨率只要求文件大小的压缩都是耍流氓。
    zioc
        3
    zioc  
    OP
       2015-09-06 18:14:21 +08:00
    @sfz97308 分辨率有需求。。。 只是 UIImageJPEGRepresentation 是按质量压缩,无法控制图片文件大小。
    fghfjujiber
        4
    fghfjujiber  
       2015-09-06 18:26:28 +08:00
    CGFloat compression = 0.9f;
    CGFloat maxCompression = 0.1f;
    int maxFileSize = 250*1024;

    NSData *imageData = UIImageJPEGRepresentation (yourImage, compression );

    while ([imageData length] > maxFileSize && compression > maxCompression )
    {
    compression -= 0.1;
    imageData = UIImageJPEGRepresentation (yourImage, compression );
    }

    ref: http://stackoverflow.com/questions/9506871/image-compression-by-size-iphone-sdk

    希望能帮到你。
    hohoho
        5
    hohoho  
       2015-09-06 18:32:46 +08:00 via iPhone
    先等比例缩放图片 size ,然后再用四楼的方法循环压缩。
    pubby
        6
    pubby  
       2015-09-06 18:59:13 +08:00
    @fghfjujiber
    @hohoho 二分法应该会更好一点
    xi_lin
        7
    xi_lin  
       2015-09-06 23:44:12 +08:00
    在小内存机型上压大图片直接用 UIImageJPEGRepresentation 有可能会死得很惨。。
    推荐 https://gist.github.com/jder/4331450#file-downscaling-alassets
    zioc
        8
    zioc  
    OP
       2015-09-07 09:46:53 +08:00
    @fghfjujiber 正在用这个方法。有问题:
    1.这个方法不一定能压到指定以下
    2. UIImageJPEGRepresentation 有时会越压越大
    3. 我先等比缩放图片, UIImageJPEGRepresentation 有时会还原图片分辨率大小

    @hohoho
    kobe1941
        9
    kobe1941  
       2015-09-07 10:15:49 +08:00
    @fghfjujiber 我之前也这么干过,然后有些长图清晰度不好,就把需求改了,以压缩比率优先,图片大小不管啦! JPEG 的压缩算法真的很不错的
    zioc
        10
    zioc  
    OP
       2015-09-07 11:07:34 +08:00
    @kobe1941 但是目前需求就是这样,对文件大小很敏感。。
    hohoho
        11
    hohoho  
       2015-09-07 18:21:58 +08:00 via iPhone
    @xi_lin 给的这个比较靠谱,之前项目中打开大图在 4s 上直接崩溃,其他设备也卡卡的,直接从 ALAsset 处理就不会有类似的问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:10 · PVG 22:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.