Object-C UIImage 美白

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 基础

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> Object-C 线程

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> OpenGL ES

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> GPUImage

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> AVFoundation

零基础 Object-C 学习路线推荐 : Object-C 学习目录 >> CocoaPods


一.UIImage 美白

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:Object-C UIImage 美白
//@Time:2021/10/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/


#define Mask8(x)  (  (x) & 0xFF )

#define R(x)  ( Mask8(x) )
#define G(x)  ( Mask8(x >> 8 )  )
#define B(x)  ( Mask8(x >> 16)  )
#define A(x)  ( Mask8(x >> 24)  )

#define RGBAMake(r, g, b, a)  (  Mask8(r) | Mask8(g) << 8 | Mask8(b) << 16 | Mask8(a) << 24 )

#pragma mark - 美白图片
/**
 *  美白图片
 *  @param imageName        图片名称
 *  @param whiteness        美白系数  10-150之间  越大越白
 */

-(UIImage *)whiteImage:(UIImage *)image
             Whiteness:(int)whiteness {
   
   if (!whiteness || whiteness < 10 ||  whiteness > 150) {
       return image;
   }
   
   // 1.拿到图片,获取宽高
   CGImageRef imageRef =image.CGImage;
   NSInteger width = CGImageGetWidth(imageRef);
   NSInteger height = CGImageGetHeight(imageRef);
   
   // 2:创建颜色空间(灰色空间, 彩色空间)->  开辟一块内存空间
   CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
   
   
   // 3:创建图片上下文
   // 为什么是UInt32类型,即是无符号32为int型 取值范围就是0-255之间
   // inputPixels是像素点集合的首地址
   UInt32 * inputPixels = (UInt32*)calloc(width * height, sizeof(UInt32));
   
   CGContextRef contextRef = CGBitmapContextCreate(inputPixels,
                                                   width,
                                                   height,
                                                   8, // 固定写法  8位
                                                   width * 4, // 每一行的字节  宽度 乘以32位 = 4字节
                                                   colorSpaceRef,
                                                   kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); // 自己查咯
   
   // 4:根据图片上线纹绘制图片
   CGContextDrawImage(contextRef, CGRectMake(0, 0, width, height), imageRef);
   
   // 5:循环遍历每个像素点进行修改
   for (int i = 0; i < height; i ++) {
       for (int j = 0; j <  width; j ++) {
           UInt32 * currentPixels = inputPixels + (i * width) + j; // 改变指针的指向  每一个像素点都能遍历到了
           UInt32 color = *currentPixels;
           
           UInt32 colorA,colorR,colorG,colorB;
           
           colorR = R(color);   // 此处宏定义  计算RGBA的值  是通过位运算算的  自己百度咯
           colorR = colorR + whiteness;
           colorR = colorR > 255 ? 255 : colorR;
           
           colorG = G(color);
           colorG = colorG + whiteness;
           colorG = colorG > 255 ? 255 : colorG;
           
           colorB = B(color);
           colorB = colorB + whiteness;
           colorB = colorB > 255 ? 255 : colorB;
           
           colorA = A(color);
           *currentPixels = RGBAMake(colorR, colorG, colorB, colorA);
       }
   }
   
   
   // 6:创建Image对象
   CGImageRef newImageRef = CGBitmapContextCreateImage(contextRef);
   UIImage * newImage = [UIImage imageWithCGImage:newImageRef];
   
   // 7:释放内存
   CGColorSpaceRelease(colorSpaceRef);
   CGContextRelease(contextRef);
   CGImageRelease(newImageRef);
   free(inputPixels);
   
   return newImage;
   
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImage* srcImage = [UIImage imageNamed:@"123.png"];

    UIImage* dstImage = [self whiteImage:srcImage Whiteness:50];

    return;
}

原图:

Object-C UIImage 美白

美白后:

Object-C UIImage 美白

二.猜你喜欢


未经允许不得转载:猿说编程 » Object-C UIImage 美白
喜欢(0) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏