swift UIImage+

//一些特定項(xiàng)目用到的UIImage+

import UIKit

extension UIImage
{
  //旋轉(zhuǎn) degrees
    func rotate(by degrees: CGFloat, flip: Bool? = nil) -> UIImage
    {
        let radians = CGFloat(degrees * (CGFloat.pi / 180.0))
        
        let bufferView = UIView(frame: CGRect(origin: CGPoint.zero, size: self.size))
        let t: CGAffineTransform = CGAffineTransform(rotationAngle: radians)
        bufferView.transform = t
        let bufferSize = bufferView.frame.size
        
        UIGraphicsBeginImageContextWithOptions(bufferSize, false, self.scale)
        let bitmap = UIGraphicsGetCurrentContext()
        bitmap?.translateBy(x: bufferSize.width / 2, y: bufferSize.height / 2)
        bitmap?.rotate(by: radians)
        if let isFlipped = flip {
            if !isFlipped {
                bitmap?.scaleBy(x: 1.0, y: -1.0)
            } else {
                bitmap?.scaleBy(x: -1.0, y: -1.0)
            }
        } else {
            bitmap?.scaleBy(x: -1.0, y: -1.0)
        }
        bitmap?.draw(self.cgImage!, in: CGRect(origin: CGPoint(x: -self.size.width / 2, y: -self.size.height / 2), size: self.size))
        
        let finalBuffer = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return finalBuffer!
    }

// MARK: - Init/Deinit functions
    convenience init?(imageBuffer: CVPixelBuffer) {
        var cgImage: CGImage?
        
        VTCreateCGImageFromCVPixelBuffer(imageBuffer, options: nil, imageOut: &cgImage)
        
        if let cgImage = cgImage {
            self.init(cgImage: cgImage)
        } else {
            return nil
        }
    }
    
    
    /// Resize image from given size.
    ///
    /// - Parameter newSize: Size of the image output.
    /// - Returns: Resized image.
    func resize(to newSize: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), true, 1.0)
        self.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let resizedImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        
        return resizedImage
    }
    
    func cutImage(rect:CGRect) ->UIImage{
        let cgimage = self.cgImage
        let newcgimage = cgimage?.cropping(to: rect)
        print(newcgimage?.width)
        let partuiimage = UIImage(cgImage: newcgimage!)
      
        UIGraphicsBeginImageContext(self.size)
        partuiimage.draw(in: rect)
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image!
    }
    /// Crop image with given rectangle frame.
    ///
    /// - Parameter rect: Rectangle zone taken from the original image.
    /// - Returns: Cropped image.
    func crop(to rect: CGRect) -> UIImage {
        if let imageRef: CGImage = self.cgImage?.cropping(to: rect) {
            let cropped: UIImage = UIImage(cgImage: imageRef, scale: 0, orientation: self.imageOrientation)
            return cropped
        }
        return self
    }
    
    /// Square up the image and centerising the cropping.
    ///
    /// - Returns: Cropped image.
    func smartCrop() -> UIImage {
        var imageHeight = self.size.height
        var imageWidth = self.size.width
        
        if imageHeight > imageWidth {
            imageHeight = imageWidth
        }
        else {
            imageWidth = imageHeight
        }
        
        let size = CGSize(width: imageWidth, height: imageHeight)
        
        guard let width = self.cgImage?.width, let height = self.cgImage?.height else {
            return self
        }
        
        let refWidth: CGFloat = CGFloat(width)
        let refHeight: CGFloat = CGFloat(height)
        
        let x = (refWidth - size.width) / 2
        let y = (refHeight - size.height) / 2
        
        let cropRect = CGRect(x: x, y: y, width: size.height, height: size.width)
        return crop(to: cropRect)
    }
    
    
//圖像buffer
    var buffer: CVPixelBuffer? {
        let attrs = [kCVPixelBufferCGImageCompatibilityKey: kCFBooleanTrue, kCVPixelBufferCGBitmapContextCompatibilityKey: kCFBooleanTrue] as CFDictionary
        var pixelBuffer: CVPixelBuffer?
        let status = CVPixelBufferCreate(kCFAllocatorDefault, Int(self.size.width), Int(self.size.height), kCVPixelFormatType_32ARGB, attrs, &pixelBuffer)
        guard (status == kCVReturnSuccess) else {
            return nil
        }
        
        CVPixelBufferLockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
        let pixelData = CVPixelBufferGetBaseAddress(pixelBuffer!)
        
        let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: pixelData, width: Int(self.size.width), height: Int(self.size.height), bitsPerComponent: 8, bytesPerRow: CVPixelBufferGetBytesPerRow(pixelBuffer!), space: rgbColorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue)
        
        context?.translateBy(x: 0, y: self.size.height)
        context?.scaleBy(x: 1.0, y: -1.0)
        
        UIGraphicsPushContext(context!)
        self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
        UIGraphicsPopContext()
        CVPixelBufferUnlockBaseAddress(pixelBuffer!, CVPixelBufferLockFlags(rawValue: 0))
        
        return pixelBuffer
    }
    //灰度圖片轉(zhuǎn)數(shù)組
    var greyData:[UInt8]{
        
        //var pixelValues: [UInt8]?
        
        let width = Int(self.size.width)
        let height = Int(self.size.height)
        let colorSpace =  self.cgImage?.colorSpace //CGColorSpaceCreateDeviceRGB()
        
        
        let bitsPerComponent = 8
        let bytesPerRow = width
        let totalBytes = height * width
        let bitmapInfo = CGImageAlphaInfo.none
        
        var intensities = [UInt8](repeating: 0, count: Int(totalBytes))
        
        let contextRef = CGContext(data: &intensities, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace!, bitmapInfo: bitmapInfo.rawValue)
    
        contextRef?.draw(self.cgImage!, in: CGRect(x: 0.0, y: 0.0, width: CGFloat(width), height: CGFloat(height)))

        return intensities
    
    }
 /** 
    Converts the image into an array of RGBA bytes.
   */
  @nonobjc public func toByteArray() -> [UInt8] {
    let width = Int(size.width)
    let height = Int(size.height)
    var bytes = [UInt8](repeating: 0, count: width * height * 4)

    bytes.withUnsafeMutableBytes { ptr in
      if let context = CGContext(
                    data: ptr.baseAddress,
                    width: width,
                    height: height,
                    bitsPerComponent: 8,
                    bytesPerRow: width * 4,
                    space: CGColorSpaceCreateDeviceRGB(),
                    bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) {

        if let image = self.cgImage {
          let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
          context.draw(image, in: rect)
        }
      }
    }
    return bytes
  }

  /**
    Creates a new UIImage from an array of RGBA bytes.
   */
  @nonobjc public class func fromByteArray(_ bytes: UnsafeMutableRawPointer,
                                           width: Int,
                                           height: Int) -> UIImage {

    if let context = CGContext(data: bytes, width: width, height: height,
                               bitsPerComponent: 8, bytesPerRow: width * 4,
                               space: CGColorSpaceCreateDeviceRGB(),
                               bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue),
       let cgImage = context.makeImage() {
      return UIImage(cgImage: cgImage, scale: 0, orientation: .up)
    } else {
      return UIImage()
    }
  }
//圖片再特定點(diǎn)添加標(biāo)記(十字)
    func addPoint(data:[Int]) -> UIImage {
        return addPoint(data: data, color: UIColor.red)
    }
    
    func addPoint(data:[Int], color:UIColor) -> UIImage {
    
    UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
   
    //傳遞1:將原始圖像繪制為背景
    self.draw(at: CGPoint(x: 0, y: 0))

    
    //傳遞2:在原始圖像上繪制線條
    let context = UIGraphicsGetCurrentContext()
    context?.setLineWidth(1.0)
    
    
    for i in 0..<data.count/2 {
        let x = data[2*i]
        let y = data[2*i+1]
        
        context?.move(to: CGPoint(x:x-5,y:y))
        context?.addLine(to: CGPoint(x:x+5,y:y))
        context?.move(to: CGPoint(x:x,y:y-5))
        context?.addLine(to: CGPoint(x:x,y:y+5))
    }
    //context?.move(to: CGPoint(x:10,y:10))
    //context?.addLine(to: CGPoint(x:100,y:100))
    context?.setStrokeColor(color.cgColor)

    context?.strokePath()
 
    
    //創(chuàng)建新圖像
    var newImage = UIGraphicsGetImageFromCurrentImageContext()
    //收拾
    UIGraphicsEndImageContext()
    
    return newImage!
   }
   
//圖片添加線
   func addLine(data1:[Int],data2:[Int]) -> UIImage {
      
      UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
     
      //傳遞1:將原始圖像繪制為背景
      self.draw(at: CGPoint(x: 0, y: 0))

      
      //傳遞2:在原始圖像上繪制線條
      let context = UIGraphicsGetCurrentContext()
      context?.setLineWidth(1.0)
      
      
      for i in 0..<data1.count/2 {
          let x1 = data1[2*i]
          let y1 = data1[2*i+1]
          let x2 = data2[2*i]
          let y2 = data2[2*i+1]
          
          context?.move(to: CGPoint(x:x1,y:y1))
          context?.addLine(to: CGPoint(x:x2,y:y2))
      }

      context?.setStrokeColor(UIColor.green.cgColor)

      context?.strokePath()
   
      
      //創(chuàng)建新圖像
      var newImage = UIGraphicsGetImageFromCurrentImageContext()
      //收拾
      UIGraphicsEndImageContext()
      
      return newImage!
     }
    
    
     
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剑勾,更是在濱河造成了極大的恐慌烹笔,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憎夷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蠢箩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谬泌,你說我怎么就攤上這事滔韵。” “怎么了掌实?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵陪蜻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贱鼻,道長(zhǎng)宴卖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任邻悬,我火速辦了婚禮症昏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拘悦。我一直安慰自己齿兔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布础米。 她就那樣靜靜地躺著分苇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屁桑。 梳的紋絲不亂的頭發(fā)上医寿,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音蘑斧,去河邊找鬼靖秩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛竖瘾,可吹牛的內(nèi)容都是我干的沟突。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼捕传,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼惠拭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庸论,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤职辅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后聂示,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體域携,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年鱼喉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秀鞭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趋观。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖气筋,靈堂內(nèi)的尸體忽然破棺而出拆内,到底是詐尸還是另有隱情,我是刑警寧澤宠默,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布麸恍,位于F島的核電站,受9級(jí)特大地震影響搀矫,放射性物質(zhì)發(fā)生泄漏抹沪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一瓤球、第九天 我趴在偏房一處隱蔽的房頂上張望融欧。 院中可真熱鬧,春花似錦卦羡、人聲如沸噪馏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欠肾。三九已至,卻和暖如春拟赊,著一層夾襖步出監(jiān)牢的瞬間刺桃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工吸祟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑟慈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓屋匕,卻偏偏與公主長(zhǎng)得像葛碧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子过吻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353