位圖上下文

位圖上下文

  • 怎么讓方形圖片變成圓形圖片?
  • 位圖上下文
    • 生成了一張新的圖片
    • 應用:水印、圓形圖片裁剪
    • 手動開啟上下文,指定上下文的大小
    • 創建時上下文的大小,決定著生成圖片的大小

水印

  • 位圖上下文的大小 = 圖片的大小

  • 加水印:生成一張新的圖片

  • 注意:生成圖片不是在view上畫東西了,不用自定義view,不用寫drawRect方法;生成圖片可以在任何地方生成。

  • 生成一張新的圖片

  • 加載圖片

  • 要繪制的文字

  • 開啟位圖上下文

    • 開啟上下文UIGraphicsBeginImageContext
    • 創建時上下文的大小決定著生成圖片的大小
  • 把圖片會知道上下文當中

    • drawAtPoint/drawInRect
  • 畫文字

    • drawAtPoint:withAttribute:
  • 從上下文當中生成一張新的圖片

    • UIGraphicsGetImageFromCurrentImageContext()
    • 把上下文當中所有繪制的內容合成到一起,生成一張新的圖片
  • 手動關閉上下文

    • UIGraphicsEndImageContext()
  • 拖線,賦值

    • self.imageV.image = newImage;

頭像(生成圓形圖片)

  • 加載圖片
  • 開啟位圖上下文
    • UIGraphicsBeginImageContext
    • 位圖上下文大小 = 圖片大小
  • 裁剪(繪制之前做裁剪)
    • UIBezierPath OvalInRect
    • UIRectClip
  • 把路徑設置為裁剪區域(超出裁剪區域以外的內容會自動裁剪掉)
    • [path addClip]
    • 對之前已經畫上去的東西,沒有作用
  • 把圖片繪制到上下文當中
    • drawAtPoint
  • 從位圖上下文當中生成一張圖片
    • UIGraphicsGetImageFromCurrentImageContext()
  • 關閉位圖上下文
    • UIGraphicsEndImageContext()
  • 拖線,展示
    • self.imageV.image = newImage;

帶有邊框的圓形圖片裁剪(抽一個分類方便復用)

  • 加載圖片

  • 設置邊框寬度

  • 開啟位圖上下文

    • 大小 = 圖片的寬高 + 2倍圖片邊框的寬高
    • UIGraphicsBeginImageContext()
  • 繪制一個大圓

    • UIBezierPath OvalInRect
  • 把大圓畫上去 path fill

  • 設置裁剪區域

    • UIBezierPath
      • x,y:邊框寬度
      • 寬度高度 = 圖片的寬高
  • 把路徑設置為裁剪區域

    • addClip
  • 把圖片繪制到上下文

  • 從位圖上下文當中生成一張圖片

    • UIGraphicsGetImageFromCurrentImageContext()
  • 關閉上下文

    • UIGraphicsEndImageContext()
  • 拖線,展示

    • self.imageV.image = newImage;
  • 抽一個分類,方便復用

    • 圖片,邊框大小,大圓的顏色是變化的
    • ObjectC-file
    • UIImage()
    • 把出現中文的,放到后面

截屏(新的知識點:二進制流)

  • 生成一張新的圖片
  • 創建一個位圖上下文
    • 大小等于屏幕大小
  • 獲取當前上下文
    • CGContextRef UIGraphicsGetCurrentContext
  • 把控制器的view內容畫到上下文當中
    • view之所以能顯示是因為內部有layer
    • self.view.layer renderInContext:
  • 從上下文當中生成一張新的圖片
    • Get
  • 關閉上下文
    • End
  • 把手機生成的圖片,生成到電腦的桌面上
    • 怎么把圖片上傳到服務器的?
    • 把圖片轉成二進制流
    • 如何把圖片轉成二進制流?
      • UIImage
      • 轉成jpe還是png
      • UIImageJPERepresentation(newImage,壓縮質量:范圍0~1)
      • 返回值NSData
      • data writeToFile:atomically:
      • UIImagePNGRepresentation(本身就是最高質量的圖片)

截屏擴展

  • [UIScreen mainScreen].scale 不是固定的值,根據手機型號的不同值不同
    • 點坐標*比例 ——> 轉成像素坐標
    • 在OC當中會自動把點坐標轉成像素
    • 在C語言當中,它不會自動轉成像素
  • 開啟上下文
    • UIGraphicsBeginImageContextWithOptions(上下文大小,是否為不透明度opaque NO,scale縮放比例點坐標與像素的比例)
    • scale 1.0
    • scale 2.0 打印的size 和生成圖片的size尺寸不一樣
    • scale 0.0 設備的[UIScreen mainScreen].scale
    • scale 縮放因子 bitmap

截圖

  • 遮蓋
  • 截圖
  • 蒙版遮蓋
    • 開始拖動的點
    • 當前手指的點
    • 寬高--x,y的偏移量
  • 添加手勢Pan Gesture Recognizer
  • 監聽拖動時會調用哪個方法,拖線,判斷手勢狀態
    • state:Begin
      • 獲取手指當前點:locationInView
      • 定義一個成員屬性,方便下面拿到當前點
    • state:Change
      • locationInView
      • 寬度:x方向偏移量
      • 高度:y方向的偏移量
      • frame
        • startP.X
        • startP.y
        • w
        • h
    • 創建遮蓋的view
      • 懶加載
      • 懶加載的好處:
        • 1.什么時候使用什么時候才去創建,節省內存
        • 2.保證對象只有一個
        • 3.保證該對象在使用時一直存在
    • state:End手指松開
      • 移除遮蓋
  • 把超過遮蓋以外的內容裁減掉
    • 生成一張和imageView一樣大的圖片
    • 開啟上下文UIGraphicsBeginImageContext:默認是透明的
    • 裁剪:UIRectClip(遮蓋的frame)
    • CGContextRef
    • renderInContext
    • 生成圖片
    • 關閉上下文
    • self.imageV.image = newImage

擴展

  • 手指松開,生成圖片不是imageView大小
  • 把生成遮蓋大小的圖片,顯示到桌面上面
  • 畫圖片,開啟上下文,遮蓋大小
  • 拿到圖片,往上面畫

圖片擦除(橡皮擦功能)

  • uerInteraction
  • 添加手勢
    • Pan
  • 擦除區域
    • 獲取當前手指的點locationInView
    • rectWH = 30
    • X:當前點x- 寬度的一半
    • Y:當前點y- 高度一半
  • 開啟上下文Begin
  • 把圖片內容畫到畫板上renderInContext
  • 擦除
    • CGContextClearRect(context,rect)
  • 生成一張圖片Get
  • 關閉上下文End
  • 替換imageView
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容