标签:源码 imageview 压缩 uiimage ios
随着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 "logo@3x.png", 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
标签:源码 imageview 压缩 uiimage ios
原文地址:http://blog.csdn.net/lixuwen521/article/details/44301043