iOS 點(diǎn)擊獲取點(diǎn)擊位置顏色和對應(yīng)的RGB

有時我們會用到獲取點(diǎn)擊某一點(diǎn)的顏色或者RGB,就好比琼蚯,控制燈的顏色酬凳,一個顏色板,點(diǎn)擊顏色板上的紅色遭庶,燈就會變紅宁仔,這個時候我們就會使用到。下面就是實(shí)現(xiàn)方法

原理峦睡,首先獲取一張屏幕截圖翎苫,在獲取截圖上面的顏色。

1 ?獲取屏幕截圖赐俗,但不是真的會截圖,只是生成了一個Image對象

```

/**

獲取屏幕截圖

@return 返回屏幕截圖

*/

-(UIImage *)fullScreenshots{

? ? UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow];

? ? UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截圖弊知,包括window

? ? [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];

? ? UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();

? ? return viewImage;

}

```

2 ?接下來就是獲取顏色和RGB

``

/**

獲取點(diǎn)擊的顏色

@param point 點(diǎn)擊的位置

@return 返回點(diǎn)擊地方的顏色

*/

- (UIColor*) getPixelColorAtLocation:(CGPoint)point withImage:(UIImage*) image {

? ? UIColor* color = nil;

? ? CGImageRef inImage = image.CGImage;

? ? // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue

? ? CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];

? ? if (cgctx == NULL) { return nil;? }

? ? size_t w = CGImageGetWidth(inImage);

? ? size_t h = CGImageGetHeight(inImage);

? ? CGRect rect = {{0,0},{w,h}};

? ? // Draw the image to the bitmap context. Once we draw, the memory

? ? // allocated for the context for rendering will then contain the

? ? // raw image data in the specified color space.

? ? CGContextDrawImage(cgctx, rect, inImage);

? ? // Now we can get a pointer to the image data associated with the bitmap

? ? // context.

? ? unsigned char* data = CGBitmapContextGetData (cgctx);

? ? if (data != NULL) {

? ? ? ? //offset locates the pixel in the data from x,y.

? ? ? ? //4 for 4 bytes of data per pixel, w is width of one row of data.

? ? ? ? @try {

? ? ? ? ? ? int offset = 4*((w*round(point.y))+round(point.x));

? ? ? ? ? ? NSLog(@"offset: %d", offset);

? ? ? ? ? ? int alpha =? data[offset];

? ? ? ? ? ? int red = data[offset+1];

? ? ? ? ? ? int green = data[offset+2];

? ? ? ? ? ? int blue = data[offset+3];

? ? ? ? ? ? NSLog(@"offset: %i colors: RGB A %i %i %i? %i",offset,red,green,blue,alpha);

? ? ? ? ? ? color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];

? ? ? ? }

? ? ? ? @catch (NSException * e) {

? ? ? ? ? ? NSLog(@"%@",[e reason]);

? ? ? ? }

? ? ? ? @finally {

? ? ? ? }

? ? }

? ? return color;

}

- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {

? ? CGContextRef? ? context = NULL;

? ? CGColorSpaceRef colorSpace;

? ? void *? ? ? ? ? bitmapData;

? ? int? ? ? ? ? ? bitmapByteCount;

? ? int? ? ? ? ? ? bitmapBytesPerRow;

? ? // Get image width, height. We'll use the entire image.

? ? size_t pixelsWide = CGImageGetWidth(inImage);

? ? size_t pixelsHigh = CGImageGetHeight(inImage);

? ? // Declare the number of bytes per row. Each pixel in the bitmap in this

? ? // example is represented by 4 bytes; 8 bits each of red, green, blue, and

? ? // alpha.

? ? bitmapBytesPerRow? = (pixelsWide * 4);

? ? bitmapByteCount? ? = (bitmapBytesPerRow * pixelsHigh);

? ? // Use the generic RGB color space.

? ? colorSpace = CGColorSpaceCreateDeviceRGB();

? ? if (colorSpace == NULL)

? ? {

? ? ? ? fprintf(stderr, "Error allocating color spacen");

? ? ? ? return NULL;

? ? }

? ? // Allocate memory for image data. This is the destination in memory

? ? // where any drawing to the bitmap context will be rendered.

? ? bitmapData = malloc( bitmapByteCount );

? ? if (bitmapData == NULL)

? ? {

? ? ? ? fprintf (stderr, "Memory not allocated!");

? ? ? ? CGColorSpaceRelease( colorSpace );

? ? ? ? return NULL;

? ? }

? ? // Create the bitmap context. We want pre-multiplied ARGB, 8-bits

? ? // per component. Regardless of what the source image format is

? ? // (CMYK, Grayscale, and so on) it will be converted over to the format

? ? // specified here by CGBitmapContextCreate.

? ? context = CGBitmapContextCreate (bitmapData,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pixelsWide,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pixelsHigh,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 8,? ? ? // bits per component

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? bitmapBytesPerRow,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? colorSpace,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? kCGImageAlphaPremultipliedFirst);

? ? if (context == NULL)

? ? {

? ? ? ? free (bitmapData);

? ? ? ? fprintf (stderr, "Context not created!");

? ? }

? ? // Make sure and release colorspace before returning

? ? CGColorSpaceRelease( colorSpace );

? ? return context;

}

```

這樣就獲取了顏色以及對應(yīng)打印的RGB

3 如何使用

//點(diǎn)擊獲取點(diǎn)擊位置的顏色

-(IBAction)onClik:(UITapGestureRecognizer*)tap{

? ? CGPoint point = [tap locationInView:self];

? ? UIColor* color = [self getPixelColorAtLocation:point withImage:[self fullScreenshots]];

}

這樣就完成了阻逮,點(diǎn)擊任意一個位置,就可以獲取對應(yīng)的顏色和RGB

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秩彤,一起剝皮案震驚了整個濱河市叔扼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漫雷,老刑警劉巖瓜富,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異降盹,居然都是意外死亡与柑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來价捧,“玉大人丑念,你說我怎么就攤上這事〗狍” “怎么了脯倚?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嵌屎。 經(jīng)常有香客問我推正,道長,這世上最難降的妖魔是什么宝惰? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任植榕,我火速辦了婚禮,結(jié)果婚禮上掌测,老公的妹妹穿的比我還像新娘内贮。我一直安慰自己,他們只是感情好汞斧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布夜郁。 她就那樣靜靜地躺著,像睡著了一般粘勒。 火紅的嫁衣襯著肌膚如雪竞端。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天庙睡,我揣著相機(jī)與錄音事富,去河邊找鬼。 笑死乘陪,一個胖子當(dāng)著我的面吹牛统台,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播啡邑,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼贱勃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谤逼?” 一聲冷哼從身側(cè)響起贵扰,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎流部,沒想到半個月后戚绕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枝冀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年舞丛,在試婚紗的時候發(fā)現(xiàn)自己被綠了耘子。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓷马,死狀恐怖拴还,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欧聘,我是刑警寧澤片林,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站怀骤,受9級特大地震影響费封,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒋伦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一弓摘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痕届,春花似錦韧献、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嚷炉,卻和暖如春渊啰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背申屹。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工绘证, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哗讥。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓嚷那,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杆煞。 傳聞我的和親對象是個殘疾皇子魏宽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 在平常開發(fā)中我們有時候會遇到要求我們獲取屏幕上某個點(diǎn)的顏色值,或者對點(diǎn)擊的點(diǎn)上的顏色值進(jìn)行比較和判斷的索绪。接下來我們...
    小東門兒閱讀 1,698評論 0 3
  • iOS中的顏色有UIColor湖员、CGColor贫悄、CIColor三種瑞驱,下面對三種顏色分別進(jìn)行說明: 一、常用的UIC...
    lfp901020閱讀 6,691評論 0 7
  • 放假――回家窄坦。 這兩天坐車真是奇了怪了唤反,昨天公交換乘凳寺,今天司機(jī)師傅竟然不知道車站在哪兒,拉著全車乘客兜兜轉(zhuǎn)轉(zhuǎn)彤侍,最后...
    春夏AI閱讀 126評論 2 0
  • 湯顯祖的臨川四夢之一的《紫釵記》肠缨,是他的早期作品。當(dāng)時他接連四次春試不售盏阶,自信心飽受摧殘晒奕,卻能頑強(qiáng)地挺了過來,仍然...
    流星雨兒下閱讀 1,910評論 15 44