1. 程式人生 > >iOS開發:實現圖片的打碼效果

iOS開發:實現圖片的打碼效果

    馬賽克(mosaic)作為人類進步路上的一大絆腳石,被人們所深惡痛絕。作為阻止人類進步小能手,我今天就給大家普及一下關於如何在iOS平臺實現圖片打碼效果的。

圖1、效果圖

本文主要介紹的是使用iOS平臺自身的API去實現圖片打碼效果的,沒有使用openCV。

一、將UIImage轉換為CGImage,並獲取圖片的大小

圖2、獲取CGImage圖片的寬高

二、獲取圖片的顏色空間

       這一步通俗的來講就是我需要知道我要操作的圖片是彩色的還是灰色的,顏色空間也是建立圖片上下文所需要的引數之一,所以這裡必須獲取。

圖3、顏色空間

三、建立圖片上下文

建立圖片上下文是為了下一步的繪製圖片,圖片上下文是繪製圖片函式的一個引數。

圖4、圖形上下文

四、更具圖形上下文繪製圖片

圖5、繪製圖片

五、更具上下文獲取圖片(點陣圖)

將CGImage轉換為可以操作畫素的點陣圖,方便打碼。

圖6、點陣圖資訊

六、打碼演算法

下面的斜線為程式碼部分,關於打碼演算法的詳細情況,我會在下一篇文章中介紹一下。

//第六:進行打碼過程

intcurrentIndex=0, preindex=0;

intlevel=20;

//定義畫素點陣列,用於儲存畫素點的值

unsignedcharpixcels[4]={0};

for(inti=0; i

for(intj=0; j

//計算當前的位置

currentIndex = i*width+j;

//獲取馬賽克第一列第一行的畫素值

if(i%level==0) {

//馬賽克矩形第一行

if(j%level==0) {

//馬賽克第一行第一列

//要想獲取第一個畫素的值,要使用C語言的資料拷貝

/*

引數一:目標資料(拷貝到哪裡)

引數二:資料來源(從哪裡拷貝)

引數三:拷貝多少內容

*/

memcpy(pixcels, imageData+4*currentIndex,4);

}else{

//其他列

//將第一個畫素點的值複製給其他畫素(在同一行的)

//實現:C函式的拷貝

//計算上一行馬賽克的位置

memcpy(imageData+4*currentIndex, pixcels,4);

}

}else{

//馬賽克矩形的其他行

//相對於上一行

preindex=(i-1)*width+j;

memcpy(imageData+4*currentIndex, imageData+4*preindex,4);

}

}

}

七、獲取圖片資料集合

圖7、圖片資料集合

八、建立馬賽克圖片並顯示在螢幕上

將重新計算過的imageData重新顯示在圖片上就是最終要的馬賽克圖片。

圖8、馬賽克圖片

九、釋放記憶體

所有的CoreGraphics框架中的類所建立的物件要手動釋放掉。

圖9、釋放記憶體

demo連線地址:https://github.com/myNameIsZuiCai/masaicImage/tree/master