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阅读 5,231评论 0 3
  • 1、禁止手机睡眠[UIApplication sharedApplication].idleTimerDisabl...
    DingGa阅读 4,801评论 1 6
  • 当我看着夕阳西下,整个城市沐浴在阳光之下,没有往日的喧嚣,整个心灵仿佛都得到了净化。 我喜欢骑着自行车绕着整个城市...
    苍之泱泱阅读 4,868评论 0 0
  • 我不敢哭 仰望天空 让眼泪倒流回源头 我不敢哭 午夜梦回 多少次无声哽咽 我不敢哭 红着眼睛 依旧带着无所谓的笑 ...
    牟若水阅读 3,106评论 15 6
  • 我们总是在唾沫横飞地吐槽自己国家的种种不好,对哪些制度的改革不满,其实也是一种不可多得的幸福,因为我们出生在一个和...
    特罗姆瑟的午夜阳光阅读 3,077评论 0 0