iOS將圖片處理成馬賽克樣式

如下方法:

(下面內容要全復制)

#pragma mark - 馬賽克處理

static CGContextRef CreateRGBABitmapContext (CGImageRef inImage)

{

CGContextRef context = NULL;

CGColorSpaceRef colorSpace;

void *bitmapData; //內存空間的指針,該內存空間的大小等于圖像使用RGB通道所占用的字節數。

int bitmapByteCount;

int bitmapBytesPerRow;

size_t pixelsWide = CGImageGetWidth(inImage); //獲取橫向的像素點的個數

size_t pixelsHigh = CGImageGetHeight(inImage);

bitmapBytesPerRow ? ?= (pixelsWide * 4); //每一行的像素點占用的字節數,每個像素點的ARGB四個通道各占8個bit(0-255)的空間

bitmapByteCount ? ?= (bitmapBytesPerRow * pixelsHigh); //計算整張圖占用的字節數

colorSpace = CGColorSpaceCreateDeviceRGB();//創建依賴于設備的RGB通道

//分配足夠容納圖片字節數的內存空間

bitmapData = malloc( bitmapByteCount );

//創建CoreGraphic的圖形上下文,該上下文描述了bitmaData指向的內存空間需要繪制的圖像的一些繪制參數

context = CGBitmapContextCreate (bitmapData,pixelsWide,pixelsHigh,8,bitmapBytesPerRow,colorSpace,kCGImageAlphaPremultipliedLast);

//Core Foundation中通過含有Create、Alloc的方法名字創建的指針,需要使用CFRelease()函數釋放

CGColorSpaceRelease( colorSpace );

return context;

}

static unsigned char *RequestImagePixelData(UIImage *inImage)

{

CGImageRef img = [inImage CGImage];

CGSize size = [inImage size];

//使用上面的函數創建上下文

CGContextRef cgctx = CreateRGBABitmapContext(img);

CGRect rect = {{0,0},{size.width, size.height}};

//將目標圖像繪制到指定的上下文,實際為上下文內的bitmapData。

CGContextDrawImage(cgctx, rect, img);

unsigned char *data = CGBitmapContextGetData (cgctx);

//釋放上面的函數創建的上下文

CGContextRelease(cgctx);

return data;

}

/*

*轉換成馬賽克,level代表一個點轉為多少level*level的正方形

*/

+ (UIImage *)transToMosaicImage:(UIImage*)orginImage blockLevel:(NSUInteger)level

{

//獲取BitmapData

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGImageRef imgRef = orginImage.CGImage;

CGFloat width = CGImageGetWidth(imgRef);

CGFloat height = CGImageGetHeight(imgRef);

CGContextRef context = CGBitmapContextCreate (nil,

width,

height,

kBitsPerComponent, ? ? ? ?//每個顏色值8bit

width*kPixelChannelCount, //每一行的像素點占用的字節數,每個像素點的ARGB四個通道各占8個bit

colorSpace,

kCGImageAlphaPremultipliedLast);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imgRef);

unsigned char *bitmapData = CGBitmapContextGetData (context);

//這里把BitmapData進行馬賽克轉換,就是用一個點的顏色填充一個level*level的正方形

unsigned char pixel[kPixelChannelCount] = {0};

NSUInteger index,preIndex;

for (NSUInteger i = 0; i < height - 1 ; i++) {

for (NSUInteger j = 0; j < width - 1; j++) {

index = i * width + j;

if (i % level == 0) {

if (j % level == 0) {

memcpy(pixel, bitmapData + kPixelChannelCount*index, kPixelChannelCount);

}else{

memcpy(bitmapData + kPixelChannelCount*index, pixel, kPixelChannelCount);

}

} else {

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

memcpy(bitmapData + kPixelChannelCount*index, bitmapData + kPixelChannelCount*preIndex, kPixelChannelCount);

}

}

}

NSInteger dataLength = width*height* kPixelChannelCount;

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, bitmapData, dataLength, NULL);

//創建要輸出的圖像

CGImageRef mosaicImageRef = CGImageCreate(width, height,

kBitsPerComponent,

kBitsPerPixel,

width*kPixelChannelCount ,

colorSpace,

kCGImageAlphaPremultipliedLast,

provider,

NULL, NO,

kCGRenderingIntentDefault);

CGContextRef outputContext = CGBitmapContextCreate(nil,

width,

height,

kBitsPerComponent,

width*kPixelChannelCount,

colorSpace,

kCGImageAlphaPremultipliedLast);

CGContextDrawImage(outputContext, CGRectMake(0.0f, 0.0f, width, height), mosaicImageRef);

CGImageRef resultImageRef = CGBitmapContextCreateImage(outputContext);

UIImage *resultImage = nil;

if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) {

// ? ? ? ?float scale = [[UIScreen mainScreen] scale];

// ? ? ? ?resultImage = [UIImage imageWithCGImage:resultImageRef scale:scale orientation:UIImageOrientationUp];

resultImage = [UIImage imageWithCGImage:resultImageRef scale:orginImage.scale orientation:orginImage.imageOrientation];

} else {

resultImage = [UIImage imageWithCGImage:resultImageRef];

}

//釋放

if(resultImageRef){

CFRelease(resultImageRef);

}

if(mosaicImageRef){

CFRelease(mosaicImageRef);

}

if(colorSpace){

CGColorSpaceRelease(colorSpace);

}

if(provider){

CGDataProviderRelease(provider);

}

if(context){

CGContextRelease(context);

}

if(outputContext){

CGContextRelease(outputContext);

}

// ? ?return [[resultImage retain] autorelease];

return resultImage;

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、禁止手機睡眠 [UIApplication sharedApplication].idleTimerDisab...
    FF_911閱讀 1,426評論 0 3
  • 1、禁止手機睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa閱讀 1,143評論 1 6
  • 當我看著夕陽西下,整個城市沐浴在陽光之下,沒有往日的喧囂,整個心靈仿佛都得到了凈化。 我喜歡騎著自行車繞著整個城市...
    蒼之泱泱閱讀 1,173評論 0 0
  • 我不敢哭 仰望天空 讓眼淚倒流回源頭 我不敢哭 午夜夢回 多少次無聲哽咽 我不敢哭 紅著眼睛 依舊帶著無所謂的笑 ...
    牟若水閱讀 428評論 15 6
  • 我們總是在唾沫橫飛地吐槽自己國家的種種不好,對哪些制度的改革不滿,其實也是一種不可多得的幸福,因為我們出生在一個和...
    特羅姆瑟的午夜陽光閱讀 425評論 0 0