1. 程式人生 > >獲取圖片的主題色Swift和OC

獲取圖片的主題色Swift和OC

想要實現一個功能,需要知道圖片的主題色,網上搜了很多都是OC寫的,Swift寫的幾乎沒有,自己找了很多部落格和文件,對UIImage做了extension,重寫了一個mostColor的屬性get方法。方便直接呼叫。有更好的辦法希望大家多多分享,歡迎留言。為了方便大家,那我把OC寫的也放在下邊了

需要註明!!!!!

我寫的這個swift版本計算主題色,為了追求精確度,計算了所有的,如果你覺得得到的結果很慢,一般主題色也不會要求很精確可以這樣改:

在這個for迴圈的地方


改成

let offSet = x * y *4

就OK啦

Swift

extensionUIImage

{

var mostColor:UIColor {

//獲取圖片資訊

let imgWidth:Int =Int(self.size.width) /2

let imgHeight:Int =Int(self.size.height) /2

//點陣圖的大小圖片寬圖片高圖片中每點包含的資訊量

let bitmapByteCount = imgWidth * imgHeight *4

//使用系統的顏色空間

let colorSpace =CGColorSpaceCreateDeviceRGB()

//根據點陣圖大小,申請記憶體空間

let bitmapData =malloc

(bitmapByteCount)

defer {free(bitmapData)}

//建立一個位圖

let context =CGContext(data: bitmapData,

                                width: imgWidth,

                                height: imgHeight,

                                bitsPerComponent:8,

                                bytesPerRow: imgWidth *

4,

                                space: colorSpace,

                                bitmapInfo:CGImageAlphaInfo.premultipliedLast.rawValue)

//圖片的rect

let rect =CGRect(x:0, y:0, width:CGFloat(imgWidth), height:CGFloat(imgHeight))

//將圖片畫到點陣圖中

        context?.draw(self.cgImage!, in: rect)

//獲取點陣圖資料

let bitData = context?.data

let data =unsafeBitCast(bitData, to:UnsafePointer<CUnsignedChar>.self)

let cls =NSCountedSet.init(capacity: imgWidth * imgHeight)

for xin0..<imgWidth {

for yin0..<imgHeight {

let offSet = (y * imgWidth + x) *4

let r = (data+ offSet    ).pointee

let g = (data+ offSet+1).pointee

let b = (data+ offSet+2).pointee

let a = (data+ offSet+3).pointee

if a >0 {

//去除透明

if!(r ==255&& g ==255&& b ==255) {

//去除白色

                        cls.add([CGFloat(r),CGFloat(g),CGFloat(b),CGFloat(a)])

                    }

                }

            }

        }

//找到出現次數最多的顏色

let enumerator = cls.objectEnumerator()

var maxColor:Array<CGFloat>? =nil

var maxCount =0

whilelet curColor = enumerator.nextObject() {

let tmpCount = cls.count(for: curColor)

if tmpCount >= maxCount{

                maxCount = tmpCount

                maxColor = curColoras?Array<CGFloat>

            }

        }

returnUIColor.init(red: (maxColor![0] /255), green: (maxColor![1] /255), blue: (maxColor![2] /255), alpha: (maxColor![3] /255))

    }

}

OC

- (UIColor*)mainColor{

int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;

//第一步先把圖片縮小加快計算速度.但越小結果誤差可能越大

CGSize thumbSize =CGSizeMake(self.size.width /2, self.size.height /2);

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,self.CGImage);

CGColorSpaceRelease(colorSpace);

//第二步取每個點的畫素值

unsignedchar* data =CGBitmapContextGetData (context);

if (data == NULL)

returnnil;

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

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

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

//            int offset = 4 * (x + y * thumbSize.width);

int offset =4 * x * y;

int red = data[offset];

int green = data[offset +1];

int blue = data[offset +2];

int alpha =  data[offset +3];

if (alpha >0) {

//去除透明

if (!(red ==255 && green ==255 && blue ==255)) {

//去除白色

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

                    [cls addObject:clr];

                }

            }

        }

    }

CGContextRelease(context);

//第三步找到出現次數最多的那個顏色

NSEnumerator *enumerator = [clsobjectEnumerator];

NSArray *curColor =nil;

NSArray *MaxColor =nil;

NSUInteger MaxCount =0;

while ( (curColor = [enumeratornextObject]) !=nil )

    {

NSUInteger tmpCount = [clscountForObject:curColor];

if ( tmpCount < MaxCount )

continue;

        MaxCount = tmpCount;

        MaxColor = curColor;

    }

return [UIColorcolorWithRed:([MaxColor[0]intValue]/255.0f)green:([MaxColor[1]intValue]/255.0f)blue:([MaxColor[2]intValue]/255.0f)alpha:([MaxColor[3]intValue]/255.0f)];

}


相關推薦

獲取圖片主題SwiftOC

想要實現一個功能,需要知道圖片的主題色,網上搜了很多都是OC寫的,Swift寫的幾乎沒有,自己找了很多部落格和文件,對UIImage做了extension,重寫了一個mostColor的屬性get方法。方便直接呼叫。有更好的辦法希望大家多多分享,歡迎留言。為了方便大家,

jsjquery如何獲取圖片真實的寬度高度_javascript技巧

寬高 clas 獲取 deb 問題 網頁 log css www. 在做pc網頁的時候,有時候會考慮按照插入的圖片的尺寸來判斷圖片是橫圖還是豎圖。然後判斷過後給予不同的展示方式! 另外一種就是在手機頁面上,在新聞頁插入的圖片往往都是按照圖片的原尺寸來展示,如果手機屏幕太小,

SwiftOC,是編譯型語言、解釋性語言、執行時語言?

首先需要明確的一點是,什麼是編譯型語言和解釋性語言 編譯型語言,就是在其執行過程中需要先將其經過編譯成機器碼來給計算機識別的,其執行效率就會比較高這個是顯而易見的,常見比如:C、C++ 而解釋型語言,是不用編譯這個過程的,只是在執行時通過相應的翻譯器(虛擬機器)逐行翻譯。這

iOS開發(Swift)——SwiftOC的互用

新建Briding-header.h Briding-header.h是Swift和OC的橋接檔案,沒有是不行的 如何新建:一般情況,在Swift工程中新建一個OC類,或者在OC工程新建一個Swift類,系統就會提示你是否建立,選擇是就行了,然後再刪除你剛

詳解swiftOC以及C語言的混編(不看後悔!)

前言:        Swift 語言出來後,可能新的專案直接使用swift來開發,但可能在過程中會遇到一些情況,某些已用OC寫好的類或封裝好的模組,不想再在swift 中再寫一次,或者有一些第三方使用OC寫的,沒有swift版本,怎麼辦?那就使用混編。這個在IOS8

Swift OC 註釋

一個工程當中,為了讓我們能夠更清晰的看出工程的結構目錄,或者我們在某行程式碼中需要有一個解釋說明的地方,就要用到註釋的功能,下面來講解Swift和OC中的註釋 單行註釋,多行註釋 Swift和OC一樣

如何對前端圖片主題進行提取?這篇文章詳細告訴你

切割 視覺 uic 返回 box 獲取 etc https 運行 本文由雲+社區發表 圖片主題色在圖片所占比例較大的頁面中,能夠配合圖片起到很好視覺效果,給人一種和諧、一致的感覺。同時也可用在圖像分類,搜索識別等方面。通常主題色的提取都是在後端完成的,前端將需要處理的圖

IOS-筆記5 (swiftOC,View大小位置)

Objective-c和swift: NSString----->Stirng         NSArray------->Array<AnyObject>      NSDictionary------>Dictionary<NSOb

swiftoc的相互呼叫,其實很簡單(基於swift4.0)

swift呼叫oc: 需要在統一的bridge標頭檔案(xxx-Bridging-Header.h)裡面import,然後即可使用。 oc呼叫swift: 需要在暴露出來的方法和屬性上加@objc否則不可用;且檔案的類需要繼承自NSObject或NSObjec

SwiftOC的區別(基於Swift3.0)

Swift無疑是iOS程式設計師的未來,但是目前蘋果公司還在不端更新和改變Swift,甚至在語法層面還在不斷探索,雖然xcode提供一些直接適配新版本Swift語法的快捷鍵,但給我們學習不免造成一些影響,這裡是基於Swift3.0和OC的一些基礎性知識的比

[Swift通天遁地]五、高階擴充套件-(5)獲取互補色、漸變色、以及圖片主題顏色

本文將演示第三方類庫“變色龍”建立互補色、漸變色、以及圖片主題顏色。 首先確保在專案中已經安裝了所需的第三方庫。 點選【Podfile】,檢視安裝配置檔案。 1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do

SwiftObjective-C混合編程——Swift調用OC

分享 發現 load 另一個 == 方法 代碼 swift 應用 在iOS應用的開發中。Swift必將代替OC,兩者的趨勢是“短期共存,長期代替”。但曾經有太多的代碼是用OC語言完畢的,而Swift的開發也從 OC中繼承了非常多的特性。兩者也是有非常多的類

js 獲取圖片寬高 圖片大小

src 查看 nts 執行 input java image 創建 wid         獲取要查看大小的img   varimg_url = ‘http://img5.imgtn.bdimg.com/it/u=4267222417,1017407570&fm=

圖片上傳時獲取圖片的寬

con element 執行 事件 body 無法 使用 圖片加載 fun   經常會遇到圖片上傳的問題,這時候我們會傳圖片的地址,寬和高到服務器,至於圖片上傳就不說了,這裏主要說圖片上傳時獲取圖片的原始寬和高的問題。   一般而言,我們把圖片上傳至服務器時,服務器會返回

獲取圖片的長

led eight fault uri release bitmap 判斷 .cn 不同的 原文:獲取圖片的長和寬 如題,當需要對圖片文件進行布局(展示)時,如何判

獲取圖片實際渲染的寬度、高度與圖片原始的寬度高度

  在寫頁面時經常會遇到需要獲取圖片的寬度、高度等情況。然而以前總是獲取的是圖片實際渲染的寬度和高度,也就是你用css或js設定後的圖片的寬度和高度,並不是圖片原始的尺寸。今天突然遇到這個問題,一時之間不知如何做,查了下資料,自己摸索了一下。特此總結一下。   例如。有這樣一張圖片,程式碼如下:  

Android之Glide獲取圖片PathGlide獲取圖片Bitmap

今天主要研究了Glide獲取圖片Path、Bitmap用法,相信也困擾了大家很久,我在網上也找了很久,基本沒有,後來研究了下,也參考了下api文件,總結了以下幾個方式: 獲取Bitmap: 1)在圖片下載快取好之後獲取 Glide.with(mContext).load

獲取圖片寬高、大小圖片型別

直接貼程式碼 public static void main(String[] args) { String picUrl = "http://placeimg.com/640/480/any.jpg"; ByteArra

Matlab 自動獲取圖片中已經框好的所有矩形的左上角座標寬高

整體效果如下: 座標資訊和矩形寬高放在txt檔案中: 整體思路如下: 1:因為圖中的矩形框是用不同顏色框出來的,我們可以把每一個顏色的所有矩形框提取出來,變成二值影象(只有黑色和白             色)。求出此顏色的每個矩形的資訊。 2:如果按顏色

獲取遠端圖片的寬高體積大小(php封裝方法)

/** * 獲取遠端圖片的寬高和體積大小 * * @param string $url 遠端圖片的連結 * @param string $type 獲取遠端圖片資源的方式, 預設為 curl 可選 fread * @param boolean $isGetFiles