iOS 中只用3x图片解决方案(附源码)

随着Apple推出了6plus,图片资源成了一大问题,2x-640x960 2x-750x1334 3x-1242x2208,各种规格的图片,安装包必然增大了不少,那么多种类的图片难免会漏掉一些,所以自己写了一个UIImage的Category库,只需要在Bundle中添加3x的图片即可实现6plus使用3x图片,6及以下版本使用2x图片。

话不多说,详情见代码和使用方式

(如果有问题请直接回复,歇歇)

//
//  UIImage+Compress.h
//  ImageCompress
//
//  Created by Hunk on 15/3/3.
//  Copyright (c) 2015年 Hunk. All rights reserved.
//
//  图片压缩,bundle中只需要存在@3x.png的图片,@2x.png的图片会根据需要自动生成到Sandbox中

#import <UIKit/UIKit.h>

/* 使用方式
 *
 * logo_huodong     :bundle中后缀为@3x.png的图片名字,使用时无需加入任何后缀,直接传入名字即可
 * imageWithName    : 为UIImage的Category方法
 *
 * UIImage *image = [UIImage imageWithName:@"logo_huodong"];
 * UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake((CGRectGetWidth(self.view.bounds) - image.size.width) / 2.0, 50.0, image.size.width, image.size.height)];
 * [imageView setImage:image];
 * [self.view addSubview:imageView];
*/

@interface UIImage (Compress)

/**
 *  Get image with image name
 *
 *  @param name : Image name. A image named "[email protected]", inputing "logo" is necessary.
 *
 *  @return UIImage
 */
+ (UIImage *)imageWithName:(NSString *)name;

@end
//
//  UIImage+Compress.m
//  ImageCompress
//
//  Created by Hunk on 15/3/3.
//  Copyright (c) 2015年 Hunk. All rights reserved.
//

#import "UIImage+Compress.h"

#define BASE_IMG_WIDTH  (1242)
#define BASE_IMG_HEIGHT (2208)

#define SUFFIX_3X_PNG   @"@3x.png"
#define SUFFIX_2X_PNG   @"@2x.png"

@implementation UIImage (Compress)

// 获取图片
+ (UIImage *)imageWithName:(NSString *)name
{
    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        return [UIImage imageNamed:name];
    }
    else
    {
        NSAssert(NO == [name hasSuffix:SUFFIX_3X_PNG], @"File name suffix @3x.png is unnecessary!");

        NSString *srcImgName = [name stringByAppendingString:SUFFIX_3X_PNG];

        NSString *desImgName = [UIImage desImageName:[UIImage getImageName:name] withExt:SUFFIX_2X_PNG];

        // Path
        NSString *cacheDir = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Caches/Resources/images/"];

        // 判断存放图片的文件夹是否存在,不存在则创建对应文件夹
        NSFileManager *fileManager = [NSFileManager defaultManager];

        BOOL isDir = NO;
        BOOL isDirExist = [fileManager fileExistsAtPath:cacheDir isDirectory:&isDir];
        if(!(isDirExist && isDir))
        {
            NSError *error = nil;
            BOOL bCreateDir = [fileManager createDirectoryAtPath:cacheDir withIntermediateDirectories:YES attributes:nil error:&error];

            if(!bCreateDir)
            {
                NSLog(@"Create Directory Failed! : %@", error.description);

                return nil;
            }
        }

        NSString *desPath = [cacheDir stringByAppendingPathComponent:desImgName];

        UIImage *desImage = [UIImage imageWithContentsOfFile:desPath];

        if(!desImage)
        {
            // 如果从Cache中没有取到图片
            if([UIImage compressImage:srcImgName compressionQuality:0.8 desPath:desPath])
            {
                // 压缩成功
                desImage = [UIImage imageWithContentsOfFile:desPath];
            }
            else
            {
                desImage = nil;
            }
        }

        return desImage;
    }
}

// 压缩图片
+ (BOOL)compressImage:(NSString *)name compressionQuality:(CGFloat)compressionQuality desPath:(NSString *)desPath
{
    if(name == nil || desPath == nil)
    {
        return NO;
    }

    UIImage *srcImage = [UIImage imageNamed:name];

    if(srcImage == nil)
    {
        return NO;
    }

    // 根据屏幕尺寸设置图片尺寸
    UIScreen *mainScreen = [UIScreen mainScreen];

    // Default is Portrait or PortraitUpsideDown
    CGSize baseImgSize = CGSizeMake(BASE_IMG_WIDTH, BASE_IMG_HEIGHT);
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight)
    {
        // LandscapeLeft or LandscapeRight
        baseImgSize = CGSizeMake(BASE_IMG_HEIGHT, BASE_IMG_WIDTH);
    }

    CGSize newSize = CGSizeMake(srcImage.size.width * srcImage.scale * (CGRectGetWidth(mainScreen.bounds) * mainScreen.scale) / baseImgSize.width, srcImage.size.height * srcImage.scale * (CGRectGetHeight(mainScreen.bounds) * mainScreen.scale) / baseImgSize.height);

    // Reset image
    UIImage *newImage = [UIImage imageWithImage:srcImage scaleToSize:newSize];

    // 对图片进行压缩
    NSData *imageData = UIImageJPEGRepresentation(newImage, compressionQuality);

    // 保存新图片
    return [imageData writeToFile:desPath atomically:YES];
}

// 重设图片的全名(带扩展名)
+ (NSString *)desImageName:(NSString *)srcImageName withExt:(NSString *)extName
{
    return [srcImageName stringByAppendingString:extName];
}

// 获取图片的名字(不带扩展名)
+ (NSString *)getImageName:(NSString *)srcImage
{
    if(srcImage)
    {
        NSArray *tempArray = [srcImage componentsSeparatedByString:@"."];

        if(tempArray)
        {
            // 有.分割的文件名
            if([tempArray count] > 1)
            {
                NSString *extName = [tempArray lastObject];

                // 严格判断文件的扩展名
                if([extName isEqualToString:@"png"] || [extName isEqualToString:@"jpg"] || [extName isEqualToString:@"jpeg"])
                {
                    return [srcImage substringWithRange:NSMakeRange(0, srcImage.length - (extName.length + 1))];
                }
                else
                {
                    return nil;
                }
            }
            else
            {
                return srcImage;
            }
        }
        else
        {
            return srcImage;
        }
    }
    return nil;
}

// 对图片尺寸进行重新设置
+ (UIImage *)imageWithImage:(UIImage*)image scaleToSize:(CGSize)newSize
{
    UIGraphicsBeginImageContext(newSize);

    [image drawInRect:CGRectMake(0.0, 0.0, newSize.width, newSize.height)];

    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newImage;
}

@end
时间: 2024-10-05 04:26:30

iOS 中只用3x图片解决方案(附源码)的相关文章

Android跟踪球-手势移动图片-自定义控件(附源码)

由于我不会制作动画图片,所以先放几及其不具备代表性的展示图片. 我以前的思路是通过动态的设置xy坐标通过手势移动来识别,但是我后来试了一下,发现运行效果极差.所以偷闲做了下这个跟踪球控件,其实实现十分简单.只要大家熟悉自定义控件的使用以及手势识别.基本上就ok了. 现在我们看下这个控件的源码TouchMoveView.java package com.fay.touchmove; import android.annotation.SuppressLint; import android.con

POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出:但是这种情况也不能解决内存溢出的问题.毕竟数据还是一次性在内存中进行保存的.这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel 首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这

IOS大图片处理(附源码)

大图片处理 ViewController.m -------------------------------------------------- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //大图片滑动 UIScrollView *scrollView = [[UIScrollView alloc] init]

Lazy&lt;T&gt;在Entity Framework中的性能优化实践(附源码)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在使用EF的过程中,导航属性的lazy load机制,能够减少对数据库的不必要的访问.只有当你使用到导航属性的时候,才会访问数据库.但是这个只是对于单个实体而言,而不适用于显示列表数据的情况. 这篇文章介绍的是,使用Lazy<T>来提高显示列

html5+css3实现3D图片(附源码)

(function( $ ) { $.fn.jigsaw = function(options) { var settings = $.extend( {}, $.fn.jigsaw.defaults, options ); $.fn.jigsaw.defaults = settings; //image value in defaults $.fn.jigsaw.defaults.image = this.children("img").attr("src");

美!视差滚动在图片滑块中的应用【附源码下载】

视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.下面分享的这个图片滑块效果是难得一见的结合视差滚动的例子,之前的文章给大家分享过,这里再推荐一下.美女很养眼吧 :) 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 您可能感兴趣的相关文章 太赞了!超炫的页面切换动画效果[附源码下载] 创意无限!一组网页边栏过渡动画[附源码下载] 好东西!动感的页面加载

iOS二十种超酷时尚艺术滤镜汇总【附源码】

本文总结了20种ios滤镜都是基于GPUImage的,有3种滤镜是GPUImage库中包含的,还有17种是Instagram中的经典滤镜,集成在一个项目中.使用GPUImage可以非常容易创建我们自己的滤镜效果总会有你想要的效果吧.在文章下面附源码下载 相信你也在使用滤镜吧,今天就让你见识一下滤镜实现其实也不是一件特别难的技术,下面附一些效果图.由于几种滤镜最主要的实现是一段片段着色程序,所以会进行展示 Amaro滤镜,通过FWAmaroFilter类来实现.它是Instagram应用中的经典滤

Web 开发中很实用的10个效果【附源码下载】

在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记得收藏:) 超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网

【转载】Web 开发中很实用的10个效果【附源码下载】

超炫的页面切换动画效果 今天我们想与大家分享一组创意的页面切换熊效果集合.我们已经在示例中罗列了一组动画,可以被应用到页面切换过程中,创造出很有趣的导航效果. 立即下载      在线演示 美!视差滚动在图片滑块中的应用 视差滚动(Parallax Scrolling)已经被广泛应用于网页设计中,这种技术能够让原本平面的网页界面产生动感的立体效果.美女很养眼吧 :) 源码下载      在线演示 网页边栏过渡动画 以细微的过渡动画显示一些隐藏的侧边栏,其余的内容也是.通常侧边栏滑入,把其他内容推