美文网首页
通过图片计算魔法色

通过图片计算魔法色

作者: 蓝天白云_Sam | 来源:发表于2020-06-28 14:45 被阅读0次

通过图片计算魔法色

@implementation UIImage (WY)

- (UIColor *)magicColor
{
    return [UIImage getMagicColorByCompressedImg:self];
}


+ (UIImage *)compressImage:(UIImage *)image maxWidth:(NSUInteger)maxWidth
{
    //压缩图片
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    if (width < maxWidth) {
        return image;
    }
    NSUInteger sizeHeight = maxWidth * image.size.height / image.size.width;
    CGSize scaleSize = CGSizeMake(maxWidth, sizeHeight);
    UIGraphicsBeginImageContext(scaleSize);
    [image drawInRect:CGRectMake(0, 0, scaleSize.width, scaleSize.height)];
    UIImage *scaleImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaleImage;
}

+ (unsigned char *)getRawDataFromImage:(UIImage *)image total:(NSUInteger *)total
{
    CGImageRef imageRef = [image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    *total = width * height;
    NSUInteger bytesPerPixel = 4;
    unsigned char *rawData = (unsigned char *)calloc(*total * bytesPerPixel, sizeof(unsigned char));

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    NSUInteger bitsPerComponent = 8;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    CGContextRef context = CGBitmapContextCreate(rawData,
                                                 width,
                                                 height,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);
    return rawData;
}

+ (UIColor *)getMagicColorByCompressedImg:(UIImage *)image
{
    NSUInteger maxWidth = 64;
    UIImage *scaleImage = [UIImage compressImage:image maxWidth:maxWidth];
    //创建CGContextRef以供遍历

    NSUInteger bytesPerPixel = 4;
    NSUInteger total = 0;
    unsigned char *rawData = [UIImage getRawDataFromImage:scaleImage total:&total];

    NSUInteger red = 0;
    NSUInteger green = 0;
    NSUInteger blue = 0;
    NSUInteger alpha = 0;
    //遍历像素
    for (int i = 0; i < total; i++) {
        NSUInteger byteIndex = i * bytesPerPixel;
        unsigned char r = rawData[byteIndex];
        unsigned char g = rawData[byteIndex + 1];
        unsigned char b = rawData[byteIndex + 2];
        unsigned char a = rawData[byteIndex + 3];
        red += r;
        green += g;
        blue += b;
        alpha += a;
    }
    free(rawData);

    if (total > 0) {
        red /= total;
        green /= total;
        blue /= total;
        alpha /= total;
    }

    //最终输出颜色
    UIColor *outputColor = [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:alpha / 255.0];

    CGFloat colorHue;
    CGFloat colorSat;
    CGFloat colorBright;
    CGFloat colorAlpha;
    [outputColor getHue:&colorHue saturation:&colorSat brightness:&colorBright alpha:&colorAlpha];

    if (colorSat < 0.618) {
        CGFloat facotr = 0.618;
        colorSat = colorSat + (facotr - colorSat) * (1 - facotr);
    }

    if (colorBright > 0.618) {
        // 不能要太亮的
        colorBright *= 0.618;
    }

    //最终输出颜色
    outputColor = [UIColor colorWithHue:colorHue saturation:colorSat brightness:colorBright alpha:colorAlpha];
    return outputColor;
}

@end

相关文章

  • 通过图片计算魔法色

    通过图片计算魔法色

  • Kingfisher清理缓存功能

    我们使用开源项目Kingfisher来实现图片缓存功能。计算图片缓存和清理图片缓存也是通过Kingfisher来实...

  • 界面优化

    界面优化 图片显示到屏幕上是CPU与GPU的协作完成 CPU: 计算视图frame,图片解码,需要绘制纹理图片通过...

  • 深度学习-计算机视觉

    定义 人通过眼睛获取图片的信息 再经过大脑的处理,得到对图片的解析 计算机通过摄像头获取图片的信息 经过CPU的数...

  • [2].从计算机如何显示图片开始

    跳去目录 计算机的渲染流程 计算机显示一张图片,要先拿到图片数据,在通过特定的方式将图片显示到显示器上,显示器的画...

  • 生成魔法色算法

  • 使用JavaScript实现图片轮播效果

    原理 图片轮播原理:将一系列大小相等的图片平铺,利用css布局只显示一张图片,其他图片隐藏,通过计算偏移量利用定时...

  • ImageGame的开发者网站和隐私声明

    应用介绍: 开始游戏: 把图片按选定的列数(行数会自动计算)切割打乱,用户通过交换两个图片的位置,把图片复原. 游...

  • iOS图片加载渲染过程

    一. CPU、GPU协同工作 1.CPU:计算试图frame、图片解码、将需要绘制的纹理图片通过数据总线交给GP...

  • iOS图片绘制渲染,View渲染

    iOS图片绘制的过程:CPU和GPU相互协作一.CPU计算frame,图片的解码,通过数据总线将需要绘制的纹理交给...

网友评论

      本文标题:通过图片计算魔法色

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