1. 程式人生 > >UIImage的各種處理(旋轉,壓縮,寫入,讀去,計算大小)等和方法的區別的介紹

UIImage的各種處理(旋轉,壓縮,寫入,讀去,計算大小)等和方法的區別的介紹

第一:UIImage的詳細使用。

//

//  Image_Do_ViewController.m

//  UIImage_處理

//

//  Created by 周雙建 on 16/4/12.

//  Copyright © 2016 周雙建. All rights reserved.

//

#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 {

    [superviewDidLoad];

self.navigationController.navigationBarHidden = NO;

self.navigationController.navigationBar.translucent = NO

;

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

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

    [self.navigationController.navigationBarsetTitleTextAttributes:@{NSFontAttributeName:[UIFontfontWithName:@"Zapfino"size:20],NSForegroundColorAttributeName:[[UIColorblueColor

] colorWithAlphaComponent:0.78f]}];

#pragma ImageDO

    [selfImageLoad];

//[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 = [UIImageimageWithData:[NSDatadataWithContentsOfFile:[[NSBundlemainBundle] 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,比前者少了50KB.如果對圖片的清晰度要求不高,還可以通過設定 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:kCGBlendModeSoftLightalpha: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];

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

// 計算圖片的大小

    long  perMBBytes = 1024*1024;

CGImageRef cgimage = [UIImageimageNamed:@"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([UIImageimageNamed:@"zsj.jpg"].CGImage)*CGImageGetHeight([UIImageimageNamed:@"zsj.jpg"].CGImage);

    long totalFileMB = totalPixel * bpp /lPixelsPerMB;

    NSLog(@"%ld",totalFileMB);

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

    [self.view addSubview:self.IM_View];

}

- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

// 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


相關推薦

UIImage各種處理旋轉壓縮寫入計算大小方法區別介紹

第一:UIImage的詳細使用。 // //  Image_Do_ViewController.m //  UIImage_處理 // //  Created by 周雙建 on 16/4/12. //  Copyright © 2016年 周雙建. All

idea ssm專案出現日誌中文亂碼封裝的json中的msg欄位中文亂碼但是json封裝的bean中的欄位不亂碼其他各種專案下的中文亂碼解決方案

   開頭劃重點!(敲黑板):rebuild和mvn package的迴圈往復好幾次的操作是解決這個問題的最主要的方法! 經過多次試驗,發現這樣做就可以正常顯示中文了 我說為什麼有時候亂碼,有時候中文正常,原來下面的這些地方都必須設定好,特別是 rebuild和m

idea ssm項目出現日誌中文亂碼封裝的json中的msg字段中文亂碼但是json封裝的bean中的字段不亂碼其他各種項目下的中文亂碼解決方案

exp model static supported 文件的 support ppi enc pat 開頭劃重點!(敲黑板):rebuild和mvn package的循環往復好幾次的操作是解決這個問題的最主要的方法! 經過多次試驗,發現這樣做就可以正常顯示中文了

隨筆-去除陣列中某個元素將陣列中val移到後面並不改變其他元素的相對順序

題目: 給定一個數組 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。 示例: 輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0] 說明: 必須在原陣列上操作,不能拷貝額外的陣列。 儘量減少操作次數。 思路:定義一個n

python中字串的各種處理未完待續

字串的定義: 由一對單引號或雙引號引起來的內容即是字串。 型別: 字串是不可變型別(無論對字串進行那種操作,字串本身是不會改變的,返回的是被操作後新的字串物件)。 操作字串的方法: 1,字串[] 語法: 字串[要獲取的子字串的下標] 作用: 獲

記錄一次網站漏洞修復過程(三):第二輪處理攔截SQL註入、跨站腳本攻擊XSS

cat nbsp ebe 嵌入 網頁 防止 記錄 用戶輸入 light 在程序編寫的時候采用參數化的SQL語句可以有效的防止SQL註入,但是當程序一旦成型,再去修改大量的數據庫執行語句並不是太現實,對網頁表單上輸入進行校驗是易於實現的方法。在webForm 頁面中開啟校驗屬

結構體的處理以c++primer plus 第六章習題4為例

類型 數據 frame bsp 傳遞 sign 習題 bre xxxxxxxx 1 const unsigned int strsize = 50; 2 struct bop //結構體就像一個數據類型如int 使用前應該先給他一個變量如本題中的bop 3

開源許可協議開源許可證GPL、BSD、MIT、Mozilla、ApacheLGPL簡單介紹

文章來源: 《開源時代》2010.02 第十七期 借鑑博文: 當Adobe、Microsoft、Sun等一系列巨頭開始表現出對”開源”的青睞時,”開源”的時代即將到來!現今存在的開源協議很多,而經過Open Source Initiative組

PHP如何實現檔案寫入前追加如依次寫入"我 愛 你"而實現的效果是"你愛我"

<?php   //因為傳統的寫入是前追加或者覆蓋,所以我們需要先讀取拼接再寫入   $file = file_get_contents('hello.txt');//假設檔案裡面已有"愛我"兩

錯誤事件ID:7026“下列引導或系統啟動驅動程序無法加載: cdrom”的解決方法

無法 cto oss 顯示錯誤 con 沒有 proc 解決 regedit 電腦沒有安裝光驅,而是使用USB光驅/虛擬光驅軟件,每次開機後“事件查看器”都顯示錯誤:“下列引導或系統啟動驅動程序無法加載: cdrom”(事件ID:7026)。   解決辦法:regedit

Java_51_組合_內部類詳解_字串String類_equals==的區別

組合 使用組合,可以獲得更多的靈活性,你甚至可以在執行的時候才決定哪幾個類組合在一起。 使用繼承,他是一種高度耦合,派生類和基類被緊緊的綁在一起,靈活性大大降低,而且,濫用繼承,也會使繼承樹變得又大又複雜,很難理解和維護。 如果是is-a關係,用繼承。【是一個[物件]】 如果是h

一步一步學區塊鏈2工具技術的介紹

有了第一篇的區塊鏈概念的大致瞭解,我們可以開始真正的學習區塊鏈之旅。 要說區塊鏈技術那麼必須說以太坊,區塊鏈技術通過上一篇的瞭解可以知道,它是支撐比特幣的一個底層技術架構,隨後被提取和抽象。以太坊將區

C++多執行緒系列CreateThread_beginthreadex區別

現在在學習多執行緒,順便將蒐集到的資料整理下來以供參考和查詢。首先在開始多執行緒學習的時候遇到的首要問題便是多執行緒的建立,在查閱資料後有CreateThread和_beginthreadex兩種方法,可能不止這兩種,以後學習到了再補充。-------------------

顯示隱藏行tr方法

一、.NET後臺中的顯示和隱藏tr、div等HTML元素的方法: 1.隱藏: atttr.Attributes.CssStyle.Value = "display:none"; 2.顯示: atttr.Attributes.CssStyle.Value = "displa

Hibernategetload區別

1)在不考慮快取的情況下,get方法會在呼叫之後立即向資料庫傳送sql語句,返回持久化物件。 load方法會在呼叫後返回一個代理物件。 該代理物件只儲存了實體物件的id,直到使用物件的非主鍵屬性時才傳送sql語句。 2)查詢資料庫中不存在的資料時,get方

Vuejs全家桶系列---屬性方法

vue例項屬性 vm.$el Vue 例項使用的根 DOM 元素。 console.log(vm.$el === document.getElementById('#app')) //true console.log(vm.$el); 結果為

Android系統76---ARTDalvik區別

ART和Dalvik區別Art上應用啟動快,執行快,但是耗費更多儲存空間,安裝時間長,總的來說ART的功效就是"空間換時間"。ART: Ahead of Time Dalvik: Just in Time什麼是Dalvik:Dalvik是Google公司自己設計用於Andro

h5移動端手機拍照壓縮旋轉上傳 vueFileReaderexif-jscanvasaxios未完待續

import EXIF from 'exif-js' export default { name: '', data () { return { compressFrondImage: '', // 壓縮之前的圖片 compressEndImage: '' // 壓縮

iOS 鍵盤處理改變鍵盤為完成鍵UITextField鍵盤顯示隱藏彈出回彈

框架 設置代理 res bool sea boa rst frame 技術分享 很多時候用到UITextField時,處理鍵盤是一個很棘手的問題。 問題一:如何隱藏鍵盤? 方案1.改變鍵盤右下角的換行(enter)鍵為完成鍵,後實現代理方法鍵盤自動回彈 keyBoard

二分細節處理沒有任何人關註但是確實讓我很傷腦處理不好會死人吧!

log 保持 轉載 tle 情況 right 程序 title 沒有 以下內容大部分為轉載 把二分查找算法寫正確需要註意的地方 今天再次解決一個需要使用二分查找的問題,再一次的,我又沒有一次過寫對.(為什麽我說"又"?)抓狂了,似乎開始有一些"二分查找恐懼癥".為了以後能夠