1. 程式人生 > >裁剪圖片(自定義裁剪範圍)

裁剪圖片(自定義裁剪範圍)

網上現在有很多的圖片剪下和從圖片庫中取出圖片並擷取的demo,但是大部分都是固定的大小,而且我們系統本來就帶可編輯的圖片裁剪功能。不過那個是正方形的,並不適用於我們多變的需求。
1.做裁剪圖片需要先放一個父view,然後再在上面放原始圖片imageview最後還需要一個裁剪圖片的區域,為了防止用view會遮蓋螢幕,到時候想滑動圖片,縮放圖片的時候就會遇到麻煩,所以需要用layer,就是之前部落格提到的用calayer繪圖,將編輯框畫出來。這樣既有了裁剪範圍又不會遮擋介面手勢。
2.父view和手勢程式碼如下

 //宣告需要切圖的可滑動的背景
    self.originImageBoardView
= [[UIView alloc] initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64)]; self.originImageBoardView.clipsToBounds = YES; [self.view addSubview:self.originImageBoardView]; //縮放圖片 UIPinchGestureRecognizer *pinchOriginGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self
action:@selector(pinchGestureAction:)]; //移動圖片 UIPanGestureRecognizer *panOriginGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureAction:)]; panOriginGestureRecognizer.maximumNumberOfTouches = 1; [self.originImageBoardView addGestureRecognizer:pinchOriginGestureRecognizer]; [self
.originImageBoardView addGestureRecognizer:panOriginGestureRecognizer];

大圖片的view

//宣告原圖
    self.originImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-64)];
    self.originImageView.image = self.originImage;
    //UIViewContentModeScaleAspectFit(將圖片全部顯示出來等比例縮放到螢幕能放下圖片為止,例如螢幕未鋪滿有,由於圖片比例不同所以顯示全部圖片內容後必定有部分不會被圖片顯示出來)UIViewContentModeScaleAspectFill(將圖片最小的部分顯示出來,例如圖片高度和寬度比例不同則全屏顯示,可能高度或者寬度超出螢幕)
    self.originImageView.contentMode = UIViewContentModeScaleAspectFit;
    [self.originImageBoardView addSubview:self.originImageView];

編輯框的程式碼

-(void)cutImageWithPath
{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(0, (SCREEN_HEIGHT+64-SCREEN_WIDTH/1.8)/2)];
    [path addLineToPoint:CGPointMake(SCREEN_WIDTH, (SCREEN_HEIGHT+64-SCREEN_WIDTH/1.8)/2)];
    [path addLineToPoint:CGPointMake(SCREEN_WIDTH, (SCREEN_HEIGHT+64+SCREEN_WIDTH/1.8)/2)];
    [path addLineToPoint:CGPointMake(0, (SCREEN_HEIGHT+64+SCREEN_WIDTH/1.8)/2)];
    [path closePath];
    CAShapeLayer *myLayer = [CAShapeLayer layer];
    myLayer.fillColor = [UIColor clearColor].CGColor;
    myLayer.strokeColor = [UIColor whiteColor].CGColor;
    myLayer.path = path.CGPath;
    myLayer.lineWidth=1;
    [self.view.layer addSublayer:myLayer];
}

兩個手勢的實現方法

- (void)pinchGestureAction:(UIPinchGestureRecognizer *)gestureRecognizer {

    UIView *gestureView = gestureRecognizer.view;
        gestureView = self.originImageView;
    CGAffineTransform affineTransform = CGAffineTransformScale(gestureView.transform,gestureRecognizer.scale, gestureRecognizer.scale);
    gestureView.transform = affineTransform;
    gestureRecognizer.scale = 1;
}

- (void)panGestureAction:(UIPanGestureRecognizer *)gestureRecognizer {
    UIView *gestureView = gestureRecognizer.view,
    *gestureViewSuperView = gestureView.superview;
    BOOL needPaddingDistance = NO;
    gestureView = self.originImageView;
    needPaddingDistance = NO;

    CGPoint touchPoint = [gestureRecognizer locationInView:gestureView.superview];

    if(gestureRecognizer.state == UIGestureRecognizerStateChanged) {
        CGPoint centerPoint = CGPointMake(gestureView.center.x + touchPoint.x - PreviousTapPoint.x, gestureView.center.y + touchPoint.y - PreviousTapPoint.y);
        if(needPaddingDistance) {
            CGFloat w = CGRectGetWidth(gestureView.frame),
            h = CGRectGetHeight(gestureView.frame);
            CGRect tempFrame = CGRectMake(centerPoint.x - w / 2, centerPoint.y - h / 2, w, h);
            if(!CGRectContainsRect(gestureViewSuperView.frame, tempFrame)) {
                return;
            }
        }
        gestureView.center = centerPoint;
    }
    PreviousTapPoint = touchPoint;
    [gestureRecognizer setTranslation:CGPointZero inView:gestureView.superview];
}

3.最後要上實現切圖的程式碼

UIGraphicsBeginImageContext(self.originImageBoardView.bounds.size); //currentView 當前的view
    [self.originImageBoardView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *originFullImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CGImageRef imageRef = originFullImage.CGImage;
    CGImageRef imagePartRef = CGImageCreateWithImageInRect(imageRef, self.cropView.frame);
    UIImage *cropImage = [UIImage imageWithCGImage:imagePartRef];
    CGImageRelease(imagePartRef);

相關推薦

裁剪圖片定義裁剪範圍

網上現在有很多的圖片剪下和從圖片庫中取出圖片並擷取的demo,但是大部分都是固定的大小,而且我們系統本來就帶可編輯的圖片裁剪功能。不過那個是正方形的,並不適用於我們多變的需求。 1.做裁剪圖片需要先放一個父view,然後再在上面放原始圖片imageview最後

Android應用--簡 美音樂播放器獲取專輯圖片定義列表介面卡

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

android 圖片任意裁剪定義裁剪,相簿

執行效果 提醒:許可權在6.0及以上需申請許可權(圖上使用的是6.0以下手機) <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Django框架十六:上傳圖片定義目錄下

如何將圖片上傳到自定義目錄下 upload_to: 在根目錄下(MEDIA_ROOT)要生成的目錄 MEDIA_ROOT: 只要上傳圖片,肯定要設定,用於指定圖片上傳的根目錄。可以設定在static下(static目錄的搜尋路徑,已經通過STATICFILES_

重力感應,圖片擺動旋轉定義控制元件 android

              自定義ImageView控制元件,根據重力感應,圖片左右搖擺(只是類似於搖一搖的簡單Demo。真機測試,不要用虛擬機器,虛擬機器沒有重力感應。會有抖動現象,因為重力感應一直在變,可以參考下http://download.csdn.net/deta

python第九天定義函數

但是 程序 turn return 默認 自定義 括號 none for 一、.函數:     如果檢測一個元素的長度用len非常簡單,也可以寫個循環來做。 s = ‘asd‘ def my_len(): i = 0 for k in s:

ASP.NET WebApi OWIN 實現 OAuth 2.0定義獲取 Token

href timespan 獲取 edi prot cep b- med 2-0 相關文章:ASP.NET WebApi OWIN 實現 OAuth 2.0 之前的項目實現,Token 放在請求頭的 Headers 裏面,類似於這樣: Accept: application

idea+maven + spring security +springmvc入門 定義登入頁面,附idea如何建立web專案

第一次使用idea,上午在eclipse中 學習了spring security 入門,下午試試在idea中搭建。 剛開始 我以為 直接將eclipse的 檔案 copy過來就行了,結果發現copy過來以後 各種報錯。 後來把m

vue+ElementUI+高德API地址模糊搜尋定義UI元件

開發環境描述: Vue.js ElementUI 高德地圖API   需求描述: 在新增地址資訊的時候,我們需要根據input輸入的關鍵字呼叫地圖的輸入提示API,獲取到返回的資料,並根據這些資料生成下拉列表,選擇某一個即獲取當前的地址相關資訊(包括位置名稱、經緯度、街區、城市、id等資

4、php的錯誤異常處理定義異常類

一、php自帶的異常處理類: <?php class Exception { protected $message; // 異常資訊 protected $code; //

Spring Boot與Logback的運用定義異常+AOP

在開發以及除錯過程中,程式設計師對日誌的需求是非常大的,出了什麼問題,都要通過日誌去進行排查,但是如果日誌不清或者雜亂無章,則不利於維護 這邊就比較詳細的列舉幾種型別的日誌,供大家參考 首先明白logback日誌是Spring Boot自帶的,不需要引入額外的包 <depend

上傳檔案動態生成目錄定義工具類

  public class UploadUtils {   // 方式一:使用用 目錄層級 分離 public static String getPath(String uuidFileName){ // 使用唯一檔名.hashCode();

使用順序表求解約瑟夫環問題 定義順序表

約瑟夫環(Josephus)問題:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第s個人開始數起,每數到第d個犯人,就拉出來處決,然後再數d個,數到的人再處決……直到剩下的最後一個可赦免。當n=5,s=1,d=2,時: 第一步:定義一個順序表Se

小程式開發的一些經驗定義picker元件

最近這段時間接了一個小程式的開發,開發了一段時間,總結一些經驗,與大家交流下。 1.小程式的頭部title,可以在json裡配置,也可以動態修改。 2.微信小程式連續點選跳轉頁面會跳轉多個頁面,可以加個公共方法,可以加在util.js裡,比如: let button

微信小程式之分享或轉發功能定義button樣式

小程式頁面內發起轉發 通過給 button 元件設定屬性open-type="share",可以在使用者點選按鈕後觸發 Page.onShareAppMessage 事件,如果當前頁面沒有定義此事件,則點選後無效果。相關元件:button wxml: <!-- 分享 --> <!--/

瀑布流定義佈局實現

這篇文章主要分享如何用自定義佈局來實現瀑布流,關於瀑布流的其他實現方式可以參考我的另一篇文章 瀑布流(UIScrollView實現),利用UICollectionView實現瀑布流有個非常大的好處就是我們不用關心重用機制,只把注重點放在如何自定義佈局來排布每一個

Linux自動化運維之Cobbler定義重裝

localhost reboot ace koan mirrors 虛擬機 all 更換 epel Cobbler?定義重裝 當現有虛擬機運?出現故障後, 需要進?重裝操作, 可通過koan進?重裝系統 將CentOS6重裝成CentOS7 1.客戶端安裝 koan #

Java 異常處理定義異常處理

異常處理分為兩種: 1、系統異常處理 2、自定義異常處理 下面分別來講解小編對這個的理解 1、系統異常處理 public class Abnormal { public static void main(String args[]) { P

Linux自動化運維之Cobbler定義系統安裝

lin gateway onf ces -a entos 網卡 定義 proc ##Cobbler自定義安裝由於 kickstart 指定某臺服務器使?某個具體的 ks ?件?較復雜,所以引? Cobbler 就變得? 常的簡單。通過物理MAC地址來區分。 Cobbler

IOS_設定UITableView Section的背景顏色和字型顏色定義section佈局

section所顯示的灰色背景和白色字型是預設的,呼叫以下方法即可實現- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { ret