美文网首页
iOS将图片处理成马赛克样式

iOS将图片处理成马赛克样式

作者: 面朝对象_春暖花开 | 来源:发表于2016-06-30 11:34 被阅读1036次

    如下方法:

    (下面内容要全复制)

    #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将图片处理成马赛克样式

          本文链接:https://www.haomeiwen.com/subject/ugoxjttx.html