欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS獲取圖片區(qū)域主色的方法

 更新時間:2021年06月16日 17:04:54   作者:pengf_wu  
這篇文章主要為大家詳細介紹了iOS獲取圖片區(qū)域主色的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

之前的項目有這樣的需求,有一個頁面可以檢索一塊區(qū)域內(nèi)圖片的主色。效果圖如圖所示

下面是如何獲取區(qū)域主色的實現(xiàn)思路:

首先,我們需要從相冊,或者相機去獲取圖片;
其次,得到圖片需要截取區(qū)域圖片;
然后,獲取截取圖片的主色。
理想中是這樣的,但是有很多阻礙,得到的圖片需要自適應imageView(imageView的寬高是固定的),截圖的得到的區(qū)域不是自己想要的區(qū)域。這里需要將圖片等比例縮放,按照ImageView的寬高。

那現(xiàn)在就直接上代碼吧!

首先我們需要等比例縮放Image:

/**
 *  縮放圖片
 *
 *  @param img  image
 *  @param size 縮放后的大小
 *
 *  @return image
 */
+ (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{
    // 創(chuàng)建一個bitmap的context
    CGFloat width = CGImageGetWidth(img.CGImage);
    CGFloat height = CGImageGetHeight(img.CGImage);

    CGFloat max = width >= height ? width:height;
    CGSize originSize;
    if (max <= 0) {
        return nil;
    }
    if (width >= height) {
        originSize = CGSizeMake(size.width, (size.width * height)/width);
    }else{
        originSize = CGSizeMake((size.height * width)/height, size.height);
    }
    // 并把它設(shè)置成為當前正在使用的context
    UIGraphicsBeginImageContext(size);
    // 繪制改變大小的圖片
    [img drawInRect:CGRectMake((size.width - originSize.width)/2, (size.height - originSize.height)/2, originSize.width, originSize.height)];
    // 從當前context中創(chuàng)建一個改變大小后的圖片
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    // 使當前的context出堆棧
    UIGraphicsEndImageContext();
    // 返回新的改變大小后的圖片
    return scaledImage;
}

之后就是截取區(qū)域圖片,這理解去10*10的方塊:

// 裁剪圖片
+ (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect {
    CGImageRef sourceImageRef = [image CGImage];
    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    CGImageRelease(newImageRef);
    return newImage;
}

然后獲取圖片的主色:

/**
 *  獲取圖片的主色
 *
 *  @param image image
 *  @param scale 精準度0.1~1
 *
 *  @return 圖片的主要顏色
 */
+ (NSDictionary *)mostColor:(UIImage *)image scale:(CGFloat)scale{


#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
    int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
#else
    int bitmapInfo = kCGImageAlphaPremultipliedLast;
#endif
    if (scale <= 0.1) {
        scale = 0.1;
    }else if(scale >= 1){
        scale = 1;
    }

    //第一步 先把圖片縮小 加快計算速度. 但越小結(jié)果誤差可能越大
        CGSize thumbSize=CGSizeMake([image size].width * scale, [image size].height * scale);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL,
                                                 thumbSize.width,
                                                 thumbSize.height,
                                                 8,//bits per component
                                                 thumbSize.width*4,
                                                 colorSpace,
                                                 bitmapInfo);

    CGRect drawRect = CGRectMake(0, 0, thumbSize.width, thumbSize.height);
    CGContextDrawImage(context, drawRect, image.CGImage);
    CGColorSpaceRelease(colorSpace);



    //第二步 取每個點的像素值
    unsigned char* data = CGBitmapContextGetData (context);

    if (data == NULL){
        CGContextRelease(context);
        return nil;
    }

    NSCountedSet *cls=[NSCountedSet setWithCapacity:thumbSize.width*thumbSize.height];

  for (int x=0; x<thumbSize.height; x++) {
        for (int y=0; y<thumbSize.width; y++) {

            int offset = 4*(x*thumbSize.width + y);
            int red = data[offset];
            int green = data[offset+1];
            int blue = data[offset+2];
            int alpha =  data[offset+3];

            NSArray *clr=@[@(red),@(green),@(blue),@(alpha)];
            [cls addObject:clr];

        }
    }
    CGContextRelease(context);


    //第三步 找到出現(xiàn)次數(shù)最多的那個顏色
    NSEnumerator *enumerator = [cls objectEnumerator];
    NSArray *curColor = nil;

    NSArray *MaxColor=nil;
    NSUInteger MaxCount=0;

    while ( (curColor = [enumerator nextObject]) != nil )
    {
        NSUInteger tmpCount = [cls countForObject:curColor];

        if ( tmpCount < MaxCount ) continue;

        MaxCount=tmpCount;
        MaxColor=curColor;

    }
    //返回三原色色值
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithCapacity:0];
    [dic setValue:@([MaxColor[0] intValue]/255.0f) forKey:@"red"];
    [dic setValue:@([MaxColor[1] intValue]/255.0f) forKey:@"green"];
    [dic setValue:@([MaxColor[2] intValue]/255.0f) forKey:@"blue"];
    return dic;
}

其實獲取圖片區(qū)域的主要顏色就是這么簡單,線面附上獲取單點的顏色:

/**
 *  獲取圖片上一個點的顏色
 *
 *  @param point 點擊的點的位置
 *  @param image image
 *
 *  @return 返回點擊點的顏色
 */
+ (UIColor *)colorAtPixel:(CGPoint)point UIImage:(UIImage *)image CGRect:(CGRect)rect{
    // Cancel if point is outside image coordinates
    if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f,rect.size.width, rect.size.height), point)) {
        return nil;
    }

    NSInteger pointX = trunc(point.x);
    NSInteger pointY = trunc(point.y);
    CGImageRef cgImage = image.CGImage;
    NSUInteger width = image.size.width;
    NSUInteger height = image.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    int bytesPerPixel = 4;
    int bytesPerRow = bytesPerPixel * 1;
    NSUInteger bitsPerComponent = 8;
    unsigned char pixelData[4] = { 0, 0, 0, 0 };
    CGContextRef context = CGBitmapContextCreate(pixelData,
                                                 1,
                                                 1,
                                                 bitsPerComponent,
                                                 bytesPerRow,
                                                 colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);
    CGContextSetBlendMode(context, kCGBlendModeCopy);

    // Draw the pixel we are interested in onto the bitmap context
    CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
    CGContextRelease(context);

    // Convert color values [0..255] to floats [0.0..1.0]
    CGFloat red   = (CGFloat)pixelData[0] / 255.0f;
    CGFloat green = (CGFloat)pixelData[1] / 255.0f;
    CGFloat blue  = (CGFloat)pixelData[2] / 255.0f;
    CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
    return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

最終就實現(xiàn)如上圖的想過,頁面丑了點,但是效果是實現(xiàn)了,又不真確的地方,請留言。

項目源碼

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS中textField限制字符串長度、字符數(shù)的方法

    iOS中textField限制字符串長度、字符數(shù)的方法

    這篇文章主要給大家介紹了關(guān)于iOS中textField限制字符串長度、字符數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • 使用SDLocalize實現(xiàn)高效完成iOS多語言工作

    使用SDLocalize實現(xiàn)高效完成iOS多語言工作

    這篇文章主要介紹了使用SDLocalize實現(xiàn)高效完成iOS多語言工作的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • iOS Label隨字自動變大效果

    iOS Label隨字自動變大效果

    這篇文章主要為大家詳細介紹了iOS Label隨字自動變大效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • iOS 獲取當前時間及時間戳的互換實例

    iOS 獲取當前時間及時間戳的互換實例

    下面小編就為大家分享一篇iOS 獲取當前時間及時間戳的互換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 淺談SwiftUI 里面$0是什么意思如何用

    淺談SwiftUI 里面$0是什么意思如何用

    這篇文章主要介紹了淺談SwiftUI 里面$0是什么意思如何用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • iOS藍牙設(shè)備名稱緩存問題的解決方法

    iOS藍牙設(shè)備名稱緩存問題的解決方法

    這篇文章主要給大家介紹了關(guān)于iOS藍牙設(shè)備名稱緩存問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • iOS開發(fā)常用線程安全鎖

    iOS開發(fā)常用線程安全鎖

    這篇文章主要為大家介紹了iOS開發(fā)常用線程安全鎖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • iOS中FMDB數(shù)據(jù)庫之增刪改查使用實例

    iOS中FMDB數(shù)據(jù)庫之增刪改查使用實例

    本篇文章主要介紹了iOS中FMDB數(shù)據(jù)庫之增刪改查使用實例,F(xiàn)MDB是一個輕量級的數(shù)據(jù)庫,用于將網(wǎng)絡(luò)資源存儲在本地。
    2017-05-05
  • iOS表視圖之下拉刷新控件功能的實現(xiàn)方法

    iOS表視圖之下拉刷新控件功能的實現(xiàn)方法

    下拉刷新是重新刷新表視圖或列表,以便重新加載數(shù)據(jù),這種模式廣泛用于移動平臺,相信大家對于此也是非常熟悉的,那么iOS是如何做到的下拉刷新呢?下面小編給大家分享iOS表視圖之下拉刷新控件的實現(xiàn)方法,一起看看吧
    2017-01-01
  • iOS15適配小結(jié)

    iOS15適配小結(jié)

    本文主要介紹了iOS15適配小結(jié),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論