iOS自动生成图片@1x,@2x ,@3x图片
来源:互联网 发布:q币拦截软件 编辑:程序博客网 时间:2024/05/01 13:00
下载地址 :
https://github.com/odot/AutoGenerateSuitImage
核心类
//// UIImage+AutoResize.h// CommonToolLib//// Created by to2dot@qq.com on 15/2/2.// Copyright (c) 2015年 todot. All rights reserved.//#import <UIKit/UIKit.h>/* *待缩放的图片 原始大小 * DOTOriginImageType3x imageName@3x.png大小图片 默认 * DOTOriginImageType2x imageName@2x.png大小图片 * DOTOriginImageType1x imageName.png大小图片 */typedef NS_ENUM(NSInteger, DOTOriginImageType) { DOTOriginImageType3x = 0, DOTOriginImageType2x = 1, DOTOriginImageType1x = 2};@interface UIImage(AutoResize)+ (void)generateSuitImagesWithOriginImagePath:(NSString*)originPath newImagePath:(NSString*)newPath;+ (void)generateSuitImagesWithOriginImagePath:(NSString*)originPath newImagePath:(NSString*)newPath originImageType:(DOTOriginImageType)originImageType;/* * 提供一套图片 自动生成多套图片 (如美工只提供了一套@3x图片,调用此函数自动生成@2x和最小倍率的图片) * * @param originPath 原始图片的路径 * @param newPath 生成后的图片路径,可以为nil,为nil则生成后的图片自动保存在 originPath/newImages 下 * @param originImageType 原始图片类型(@3x、@2x、@1x,当然@1x后缀是不存在的) * @param autoEnLarge 是否自动放大(当提供的图片类型不是@3x时,enLarge=YES会自动生成@3x类型的图片) * * @return void */+ (void)generateSuitImagesWithOriginImagePath:(NSString*)originPath newImagePath:(NSString*)newPath originImageType:(DOTOriginImageType)originImageType autoGenerateEnLargeImage:(BOOL)enLarge;@end
.m文件
//// UIImage+AutoResize.m// CommonToolLib//// Created by to2dot@qq.com on 15/2/2.// Copyright (c) 2015年 todot. All rights reserved.//#import "UIImage+AutoResize.h"@implementation UIImage(AutoResize)// 创建目录+ (BOOL)createDirectory:(NSString*)directory{ NSError* error = nil; BOOL isCreatDirSucc = [[NSFileManager defaultManager] createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:&error]; if (!isCreatDirSucc && !error) { NSLog(@"创建%@目录失败:%@", directory, error); return NO; } else { NSLog(@"创建%@目录成功", directory); return YES; }}// 检测目录是否存在+ (BOOL)isDirectoryExist:(NSString*)directory{ BOOL isDir = NO; // 如果目录不存在则创建目录 BOOL isDirExist = [[NSFileManager defaultManager] fileExistsAtPath:directory isDirectory:&isDir]; if (!isDirExist && !isDir) { if ([self createDirectory:directory] == NO) { return NO; } } isDirExist = [[NSFileManager defaultManager] fileExistsAtPath:directory]; return isDirExist;}+ (UIImage*)originImage:(UIImage *)image scaleToSize:(CGSize)size{ // 创建一个bitmap的context // 并把它设置成为当前正在使用的context UIGraphicsBeginImageContext(size); // 绘制改变大小的图片 [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; // 从当前context中创建一个改变大小后的图片 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); // 返回新的改变大小后的图片 return scaledImage;}// 按照倍数缩放+ (UIImage*)originImage:(UIImage *)image scaleWithMultiple:(CGFloat)multiple{ CGSize size = image.size; // 创建一个bitmap的context // 并把它设置成为当前正在使用的context UIGraphicsBeginImageContext(size); // 绘制改变大小的图片 [image drawInRect:CGRectMake(0, 0, size.width * multiple, size.height * multiple)]; // 从当前context中创建一个改变大小后的图片 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); // 返回新的改变大小后的图片 return scaledImage;}+ (void)generateSuitImagesWithOriginImagePath:(NSString*)originPath newImagePath:(NSString*)newPath{ [self generateSuitImagesWithOriginImagePath:originPath newImagePath:newPath originImageType:DOTOriginImageType3x autoGenerateEnLargeImage:NO];}+ (void)generateSuitImagesWithOriginImagePath:(NSString*)originPath newImagePath:(NSString*)newPath originImageType:(DOTOriginImageType)originImageType{ [self generateSuitImagesWithOriginImagePath:originPath newImagePath:newPath originImageType:originImageType autoGenerateEnLargeImage:NO];}/* * 提供一套图片 自动生成多套图片 (如美工只提供了一套@3x图片,调用此函数自动生成@2x和最小倍率的图片) * * @param originPath 原始图片的路径 * @param newPath 生成后的图片路径,可以为nil,为nil则生成后的图片自动保存在 originPath/newImages 下 * @param originImageType 原始图片类型(@3x、@2x、@1x,当然@1x后缀是不存在的) * @param autoEnLarge 是否自动放大(当提供的图片类型不是@3x时,enLarge=YES会自动生成@3x类型的图片) * * @return void */+ (void)generateSuitImagesWithOriginImagePath:(NSString*)originPath newImagePath:(NSString*)newPath originImageType:(DOTOriginImageType)originImageType autoGenerateEnLargeImage:(BOOL)enLarge{ NSFileManager* fileManager = [NSFileManager defaultManager]; NSLog(@"------ %@ ------",fileManager.currentDirectoryPath); BOOL isDir = NO; BOOL isDirExist = [fileManager fileExistsAtPath:originPath isDirectory:&isDir]; if (isDir == NO || isDirExist == NO) { NSLog(@"%@ %@不存在", NSStringFromClass([self class]), originPath); return; } NSString* newImagePath = [NSString stringWithFormat:@"%@", newPath]; if (newPath == nil || newPath.length == 0) { newImagePath = [originPath stringByAppendingPathComponent:@"newImages"]; } // 判读目录是否存在 不存在则创建 if ([self isDirectoryExist:newImagePath] == NO) { NSLog(@"%@ %@不存", NSStringFromClass([self class]), newImagePath); return; } NSString* tmpImagePath = [newImagePath stringByAppendingPathComponent:@"tmp"]; if ([self isDirectoryExist:tmpImagePath] == NO) { NSLog(@"%@ 创建临时目录[%@]失败", NSStringFromClass([self class]), tmpImagePath); return; } // 遍历目录下的文件 NSDirectoryEnumerator* direnum = [fileManager enumeratorAtPath:originPath]; NSMutableArray *files = [NSMutableArray array]; NSString *filename ; while (filename = [direnum nextObject]) { if ([[filename pathExtension] isEqualToString:@"png"]) { [files addObject: filename]; } } NSLog(@"%@ %@", NSStringFromClass([self class]), files); for (NSString* filename in files) { NSString* prefix = [[filename componentsSeparatedByString:@"."] objectAtIndex:0]; NSString* filePrefix = [NSString stringWithString:prefix]; NSRange range = [prefix rangeOfString:@"@"]; if (range.length != 0) { //如果包含@符号 剔除 @3x, @2x等字符 filePrefix = [[prefix componentsSeparatedByString:@"@"] objectAtIndex:0]; } // 临时目录 NSString* oldPath = [originPath stringByAppendingPathComponent:filename]; NSString* tmpNewImagePath = [[tmpImagePath stringByAppendingPathComponent:filePrefix] stringByAppendingPathExtension:@"png"]; NSString* bigPath = [[newImagePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@3x", filePrefix]] stringByAppendingPathExtension:@"png"]; NSString* middlePath = [[newImagePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x", filePrefix]] stringByAppendingPathExtension:@"png"]; NSString* smallPath = [[newImagePath stringByAppendingPathComponent:filePrefix] stringByAppendingPathExtension:@"png"]; /* 必须先将 图片名中包含@3x/@2x的图片移动并重命名为没有@3x/@2x的图片(如果不重命名,会导致计算加载正确的图片),然后再缩放 涉及到UIImage加载行为 */ NSError* error = nil; BOOL copySucc = [[NSFileManager defaultManager] copyItemAtPath:oldPath toPath:tmpNewImagePath error:&error]; if (copySucc && error == nil) { if (originImageType == DOTOriginImageType3x) { [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:bigPath WithMultiple:1.0]; [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:middlePath WithMultiple:0.667]; [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:smallPath WithMultiple:0.334]; } else if (originImageType ==DOTOriginImageType2x) { [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:middlePath WithMultiple:1.0]; [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:smallPath WithMultiple:0.5]; if (enLarge == YES) { [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:bigPath WithMultiple:1.5]; } } else if (originImageType == DOTOriginImageType1x) { [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:smallPath WithMultiple:1.0]; if (enLarge == YES) { [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:middlePath WithMultiple:2.0]; [self saveResizedImageWithOriginPath:tmpNewImagePath toNewPath:bigPath WithMultiple:3.0]; } } } }}+ (BOOL)saveResizedImageWithOriginPath:(NSString*)originPath toNewPath:(NSString*)newPath WithMultiple:(CGFloat)multiple{ UIImage* originImage = [UIImage imageNamed:originPath]; CGSize newSize = CGSizeMake(originImage.size.width * multiple, originImage.size.height * multiple); UIImage* newImage = [self originImage:originImage scaleToSize:newSize]; BOOL scaleSucc = [UIImagePNGRepresentation(newImage) writeToFile:newPath atomically:YES]; if (scaleSucc == YES) { NSLog(@"%lf:%@---->%@成功", multiple, originPath, newPath); } return scaleSucc;}@end
调用方法如下
/Users/hebiao/Desktop/cut3x 这个是新建的在桌面的一个文件夹,将需要转换的图片放在这个文件夹中
[UIImage generateSuitImagesWithOriginImagePath:@"/Users/hebiao/Desktop/cut3x" newImagePath:nil originImageType:DOTOriginImageType3x autoGenerateEnLargeImage:NO]; // 如果提供的切图是@2x的图片 autoGenerateEnLargeImage=YES 会自动生成其对应的@3x图片 [UIImage generateSuitImagesWithOriginImagePath:@"/Users/<span style="font-family: Arial, Helvetica, sans-serif;">hebiao</span><span style="font-family: Arial, Helvetica, sans-serif;">/Desktop/cut2x" newImagePath:nil originImageType:DOTOriginImageType2x autoGenerateEnLargeImage:YES];</span> /* // 如果提供的切图是最小倍率的图片 autoGenerateEnLargeImage=YES 会自动生成其对应的@3x和@2x图片(图片效果不佳) [UIImage generateSuitImagesWithOriginImagePath:@"/Users/<span style="font-family: Arial, Helvetica, sans-serif;">hebiao</span><span style="font-family: Arial, Helvetica, sans-serif;">/Desktop/cut2x" newImagePath:nil originImageType:DOTOriginImageType1x autoGenerateEnLargeImage:YES];</span> */
0 0
- iOS自动生成图片@1x,@2x ,@3x图片
- 通过PDF矢量图片自动生成@1x, @2x, @3x切图
- RTImageAssets插件--@3x可自动生成@2x图片
- ios 命令行 生成@2x @3x图片
- iOS图片@2X, @3x
- iOS 自动将@3x的图片处理成@1x的图片
- 生成@3x图片对应的@2x和@1x版本--RTImageAssets
- 生成@3x图片对应的@2x和@1x版本--RTImageAssets
- xcode插件 - 生成@3x图片对应的@2x和@1x版本--RTImageAssets
- RTImageAssets:自动生成全尺寸icon以及2x/3x图片
- RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
- RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
- 插件推荐:RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
- iOS中图片@1x @2x @3x的意思
- 关于ios中1x、2x、3x图片适配,只用一张搞定
- iOS移动开发1x 、2x 、3x图片介绍
- iOS中图片@1x @2x @3x的意思
- iOS 中@2x 和 @3x 图片加载问题
- Crontab定时任务
- Lintcode—落单的数
- rhel 6.7简单安装postgresql 9.2.10
- NodeJs操作mysql数据库(coffee版)
- Android自定义类似ProgressDialog效果的Dialog
- iOS自动生成图片@1x,@2x ,@3x图片
- Codeforces Round #346 (Div. 2) C模拟
- iOS 去掉tableViewCell 点击效果 三个简单方法
- 大型网站之存储瓶颈(数据库的水平扩展)
- C#中偏移量和长度超出数组的界限的问题
- 免责声明
- 修改android默认锁屏方式
- caffe cudnn出现错误: declaration is incompatible with "const char *cudnnGetErrorString(cudnnStatus_t)"
- Spring Data Redis 学习(一)