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;

}

你可能感兴趣的:(iOS将图片处理成马赛克样式)