2018-03-12

UIImage的详细使用

#import "Image_Do_ViewController.h"

#define APP_Width     [UIScreen mainScreen].bounds.size.width

#define APP_Height    [UIScreen mainScreen].bounds.size.height

@interface Image_Do_ViewController ()

@property(nonatomic,strong) UIImageView * IM_View;

@end

@implementation Image_Do_ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

 self.navigationController.navigationBarHidden = NO;

 self.navigationController.navigationBar.translucent = NO;

 self.view.backgroundColor = [[UIColor whiteColor] colorWithAlphaComponent:1.0f];

 self.title = @"Succes QQ Bar-Provide";

    [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Zapfino" size:20],NSForegroundColorAttributeName:[[UIColor blueColor] colorWithAlphaComponent:0.78f]}];

#pragma ImageDO

    [self ImageLoad];

 //[self ImageLoad];

 // Do any additional setup after loading the view.

}

-(void)ImageLoad{

 self.IM_View = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, APP_Width -40, APP_Height - 104)];

 self.IM_View.contentMode = UIViewContentModeScaleAspectFit;

 /*

* 这样加载会造成图片缓存

     *  self.IM_View.image = [UIImage imageNamed:@"zsj.jpg"];

     *

     *  1)用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的 内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一 个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利 用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。

     */


 //self.IM_View.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]  pathForResource:@"zsj" ofType:@"jpg"]];

 /*

* 另一种加载方式,不进行图片的缓存

     *

     *    self.IM_View.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]    pathForResource:@"zsj" ofType:@"jpg"]];

* 仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。

     */


 /*

     *   self.IM_View.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"zsj" ofType:@"jpg"]]];

     *

*   3) 利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。

     *

     */

 /*********************************************************************************/

 NSLog(@"W:%f ----H: %f",self.IM_View.image.size.width ,self.IM_View.image.size.height);

 UIImage * MY = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"zsj" ofType:@"jpg"]] scale:0.5];

 NSLog(@"M_W:%f ----M_H: %f",MY.size.width ,MY.size.height);

 /*

     *

* scale 为 0.5 的输出

     *

2016-04-14 09:29:00.896 UIImage_处理[880:25088] W:500.000000 ----H: 379.000000

2016-04-14 09:29:00.896 UIImage_处理[880:25088] M_W:1000.000000 ----M_H: 758.000000

     *

     *

* scale 为 2 的输出

2016-04-14 09:25:59.338 UIImage_处理[838:23420] W:500.000000 ----H: 379.000000

2016-04-14 09:25:59.338 UIImage_处理[838:23420] M_W:250.000000 ----M_H: 189.500000

     */

 /*

     *+ (nullable UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale NS_AVAILABLE_IOS(6_0);

     *

*  @scale 参数的说明

*  scale 为小于零的数值(数值为 A)的时候 ,image的大小(size)是按(1/A)增加的,增加后的大小是:size * (1/A)。

*  scale 为大于零的数值(数值为 A)的时候 ,image的大小(size)是按(1/A)减小的,减小后的大小是:size * (1/A)。

     */

 /*********************************************************************************/

 // 将图片转化为二进制流

 NSData * ImageData = UIImagePNGRepresentation(MY);

 /*

     *   UIImagePNGRepresentation(UIImage * __nonnull image); 

     *   return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format

     */

 NSData * ImageData1 = UIImageJPEGRepresentation(MY, 1.0f);

 /*

     *  return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)

     */

 /*

UIImagePNGRepresentation  |  UIImageJPEGRepresentation 两个的区别


UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多.譬如,同样是读取摄像头拍摄的同样景色的照片, UIImagePNGRepresentation()返回的数据量大小为199K ,而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的数据量大小只为140KB,比前者少了50多KB.如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGRepresentation函数的第二个参数,大幅度降低图片数据量.譬如,刚才拍摄的图片, 通过调用UIImageJPEGRepresentation(UIImage* image, 1.0)读取数据时,返回的数据大小为140KB,但更改压缩系数后,通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有11KB多,大大压缩了图片的数据量 ,而且从视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小.

     */

 /*********************************************************************************/

 // 将图片写入文件

 NSData * ImageData_W = UIImageJPEGRepresentation(MY, 0.5f);

 // 获取系统沙河路径

 NSArray * ArrayPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

 NSString * path = [ArrayPath objectAtIndex:0];

 // 开始写入路径的拼接

 NSString * filePath = [path stringByAppendingString:@"Image.text"];

 // 写入

 BOOL Succes =   [ImageData_W writeToFile:filePath atomically:YES];

 NSLog(@"%d",Succes);

 /*

 输出 : UIImage_处理[1130:41357] 1 写入成功

     */

 // 将图片从沙河读取出来

 NSString * ReadPath = filePath;

 NSData * ReadData = [NSData dataWithContentsOfFile:ReadPath];

 UIImage * ReadImage = [UIImage imageWithData:ReadData scale:2];

 //self.IM_View.image = ReadImage;

 /*********************************************************************************/

 // 改变图像的方向

 // self.IM_View.image = [UIImage imageWithCGImage:ReadImage.CGImage scale:1.0f orientation:UIImageOrientationLeftMirrored];

 /*

* 不用旋转控件,来实现图像的角度旋转

     typedef NS_ENUM(NSInteger, UIImageOrientation) {

UIImageOrientationUp,            // default orientation 默认

UIImageOrientationDown,          // 180 deg rotation     180度的转向

UIImageOrientationLeft,          // 90 deg CCW 图像逆时针 90度

UIImageOrientationRight,         // 90 deg CW 图像顺时针 90度

UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip 图片的像素 中间对称水平翻转

UIImageOrientationDownMirrored,  // horizontal flip 图片的像素 中间对称垂直翻转

UIImageOrientationLeftMirrored,  // vertical flip 图片的像素 左翻转

UIImageOrientationRightMirrored, // vertical flip 图片的像素 右翻转

     };

     */

 /*********************************************************************************/

 // 用图像获取上下文

 UIGraphicsBeginImageContext(ReadImage.size); // 创建上下文

 CGContextRef ContextRef = UIGraphicsGetCurrentContext();// 获取上下文对象

 CGContextSaveGState(ContextRef);// 保存上下文,有利于还原场景

 /*

     *  [ReadImage drawInRect:CGRectMake(10, 10, 60, 60)]; 

* 是在指定的大小范围内绘制图片,图片可完全绘出

     */


 /*

     *  [ReadImage drawAtPoint:CGPointMake(100, 100)];

* 这个是不改变图片的大小,是更改图片的起始位置

     */

[ReadImage drawInRect:CGRectMake(10, 10, 220, 220) blendMode:kCGBlendModeSoftLight alpha:1.0f];

 /*

     *  - (void)drawInRect:(CGRect)rect blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha;

    typedef CF_ENUM (int32_t, CGBlendMode) {

kCGBlendModeNormal, 正常;也是默认的模式。前景图会覆盖背景图

kCGBlendModeMultiply, 正片叠底;混合了前景和背景的颜色,最终颜色比原先的都暗

kCGBlendModeScreen, 滤色;把前景和背景图的颜色先反过来,然后混合

kCGBlendModeOverlay, 覆盖;能保留灰度信息,结合kCGBlendModeSaturation能保留透明度信息,在imageWithBlendMode方法中两次执行drawInRect方法实现我们基本需求

kCGBlendModeDarken, 变暗

kCGBlendModeLighten, 变亮

kCGBlendModeColorDodge, 颜色变淡

kCGBlendModeColorBurn, 颜色加深

kCGBlendModeSoftLight, 柔光

kCGBlendModeHardLight, 强光

kCGBlendModeDifference, 插值

kCGBlendModeExclusion, 排除

kCGBlendModeHue, 色调

kCGBlendModeSaturation, 饱和度

kCGBlendModeColor, 颜色

kCGBlendModeLuminosity, 亮度

kCGBlendModeClear,                    R = 0 清除所有的颜色

    kCGBlendModeCopy,                     R = S

    kCGBlendModeSourceIn,                 R = S*Da

    kCGBlendModeSourceOut,                R = S*(1 - Da)

    kCGBlendModeSourceAtop,               R = S*Da + D*(1 - Sa)

    kCGBlendModeDestinationOver,          R = S*(1 - Da) + D

    kCGBlendModeDestinationIn,            R = D*Sa

    kCGBlendModeDestinationOut,           R = D*(1 - Sa)

    kCGBlendModeDestinationAtop,          R = S*(1 - Da) + D*Sa     

    kCGBlendModeXOR,                      R = S*(1 - Da) + D*(1 - Sa)

    kCGBlendModePlusDarker,               R = MAX(0, (1 - D) + (1 - S))

    kCGBlendModePlusLighter               R = MIN(1, S + D)  };

*/

 //self.IM_View.image = UIGraphicsGetImageFromCurrentImageContext();

 CGContextRelease(ContextRef);// 移除保存的上下文

 UIGraphicsEndImageContext(); // 结束图像上下文

 /*********************************************************************************/

 // 图片的填充,或者拉伸

 //self.IM_View.image = [ReadImage stretchableImageWithLeftCapWidth:50 topCapHeight:50];

 /*

     *  - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight  |  - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

* 这个函数是UIImage的一个实例函数,它的功能是创建一个内容可拉伸,而边角不拉伸的图片,需要两个参数,第一个是不拉伸区域和左边框的宽度,第二个参数是不拉伸区域和上边框的宽度。

     */

//    self.IM_View.image = [ReadImage resizableImageWithCapInsets:UIEdgeInsetsMake(20, 20, 202, 20)];

 self.IM_View.image = [ReadImage imageFlippedForRightToLeftLayoutDirection];

 /*********************************************************************************/

 // 计算图片的大小

 longperMBBytes = 1024*1024;

 CGImageRef cgimage = [UIImage imageNamed:@"zsj.jpg"].CGImage;

 size_t bpp = CGImageGetBitsPerPixel(cgimage);

 size_t bpc = CGImageGetBitsPerComponent(cgimage);

 size_t bytes_per_pixel = bpp / bpc;

 long lPixelsPerMB  = perMBBytes/bytes_per_pixel;

 long totalPixel = CGImageGetWidth([UIImage imageNamed:@"zsj.jpg"].CGImage)*CGImageGetHeight([UIImage imageNamed:@"zsj.jpg"].CGImage);

 long totalFileMB = totalPixel * bpp /lPixelsPerMB;

 NSLog(@"%ld",totalFileMB);

 /*********************************************************************************/

[self.view addSubview:self.IM_View];

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

 // Dispose of any resources that can be recreated.

}

/*

#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    // Get the new view controller using [segue destinationViewController].

    // Pass the selected object to the new view controller.

}

*/

@end

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容