先看效果看 載入了一張image,根據四個頂點任意變換。 知識點:1.BitmapContext 2.矩陣變換 一.什麼是BitmapContext 官方解釋: The number of components for each pixel in a bitmap graphics context ...
先看效果看 載入了一張image,根據四個頂點任意變換。 知識點:1.BitmapContext 2.矩陣變換 一.什麼是BitmapContext 官方解釋: The number of components for each pixel in a bitmap graphics context is specified by a color space, defined by a CGColorSpaceRef. The bitmap graphics context specifies whether the bitmap should contain an alpha channel, and how the bitmap is generated. 通俗來講: 首先,我們根據圖片創建一個BitmapContext,把一張圖片繪製到這個BitmapContext上。這時你可以把圖片看成是由很多個彩色的點組成的。 圖片局部放大後就形成了一個表格。每個單元代表一個像素點其中包含了4個元素:alpha(透明度)紅 綠 藍 每個像素點包含的信息 1.創建
CGContextRef contexRef = CGBitmapContextCreate(void *data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow, CGColorSpaceRef space, uint32_t bitmapInfo);data: 創建BitmapContext所需的記憶體空間,由malloc創建 width: 圖片的寬度 height: 圖片的高度 bitsPerComponent: data中的每個數據所占的位元組數 bytesPerRow: 圖片每行的位數 = 圖片列數*4(因為每個點有4個通道) space: 顏色區間 bitmapInfo: bitmap類型,一般選擇PremultipliedFirst(ARGB) 2.讀取圖片中的所有像素點數據
unsigned char* needData = malloc(需要多大); needData = CGBitmapContextGetData(contexRef);3.讀取某個點的內容
int alpha = needData[4*n]; int red = needData[4*n+1]; int green = needData[4*n+2]; int blue = needData[4*n+3];一個點由4個信息表示 4.修改某個點的內容
newData[4*n ] = alpha; newData[4*n + 1] = red; newData[4*n + 2] = green; newData[4*n + 3] = blue;5.把data數據從新編程UIImage
CGImageRef cgImage = CGBitmapContextCreateImage(newContext); _imageView.image = [UIImage imageWithCGImage:cgImage ];有個了幾個函數,接下來就需要你來指定一套規則,獲取到的所有像素點,然後從組元素生成一張新的圖片。 而這套規則就是下麵對應的矩陣變換 二.矩陣變換 註:這個部分原理居多,若有不是可以直接跳過copy代碼,不影響你功能的實現 1.什麼是矩陣 若用一個行向量[X1 X2 ….Xn]表示n維空間中的一個點的坐標,那麼n維空間中m個點坐標就可以表示為一個向量集合,這個集合就是一個矩陣。
也就是說我們二維圖片中所有的(x,y)坐標的所有點組成的一個集合就是一個矩陣. 圖片和其中的某些點 2.圖形變換 我們對圖像的常見操作其實就是對圖形進行評議、旋轉、縮放等矩陣變換,實質上就是改變了各個點的坐標。
所有的圖形點由老的x y坐標變成了新的x` y`坐標
3.常見的圖形變換 基本的二維變換可包括旋轉、縮放、扭曲,和平移四種,