iOS 圖片顏色選擇器

先看效果把


重寫了圖片touche事件

主要是拖動(dòng)范圍的設(shè)置

- (void)touchesBegan:(NSSet*)touches withEvent:(nullable UIEvent *)event {

UITouch *touch = [touches anyObject];

CGPoint pointL = [touch locationInView:self];

if (pow(pointL.x - self.bounds.size.width/2, 2)+pow(pointL.y-self.bounds.size.width/2, 2) <= pow(self.bounds.size.width/2, 2)) {

UIColor *color = [self colorAtPixel:pointL];

self.panView.center = pointL;

self.panView.backgroundColor =color;

if (self.currentColorBlock) {

self.currentColorBlock(color);

}}}



- (void)touchesMoved:(NSSet*)touches withEvent:(nullable UIEvent *)event {

UITouch *touch = [touches anyObject];

CGPoint pointL = [touch locationInView:self];

if (pow(pointL.x - self.bounds.size.width/2, 2)+pow(pointL.y-self.bounds.size.width/2, 2) <= pow(self.bounds.size.width/2, 2)) {

UIColor *color = [self getPointColorWithImage:self.image location:pointL];

self.panView.center = pointL;

self.panView.backgroundColor =color;

if (self.currentColorBlock) {

self.currentColorBlock(color);}}}

- (void)touchesEnded:(NSSet*)touches withEvent:(nullable UIEvent *)event {

UITouch *touch = [touches anyObject];

CGPoint pointL = [touch locationInView:self];

if (pow(pointL.x - self.bounds.size.width/2, 2)+pow(pointL.y-self.bounds.size.width/2, 2) <= pow(self.bounds.size.width/2, 2)) {

UIColor *color = [self getPointColorWithImage:self.image location:pointL];

self.panView.center = pointL;

self.panView.backgroundColor =color;

if (self.currentColorBlock) {

self.currentColorBlock(color);

}}}


//獲取圖片上某坐標(biāo)點(diǎn)對(duì)應(yīng)的像素的rgba值

- (UIColor *)getPointColorWithImage:(UIImage *)image location:(CGPoint)point{

UIColor *pointColor = nil;

//如果圖片上不存在該點(diǎn)返回nil

if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), point)) {

return nil;

}

NSInteger pointX = truncl(point.x); //直接舍去小數(shù),如1.58 -> 1.0

NSInteger pointY= truncl(point.y);

CGImageRef cgImage = image.CGImage;

NSUInteger width = image.size.width;
NSUInteger height = image.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();? //bitmap上下文使用的顏色空間
int bytesPerPixel = 4;? //bitmap在內(nèi)存中所占的比特?cái)?shù)
int bytesPerRow = bytesPerPixel * 1;? //bitmap的每一行在內(nèi)存所占的比特?cái)?shù)
NSUInteger bitsPerComponent = 8;? //內(nèi)存中像素的每個(gè)組件的位數(shù).例如,對(duì)于32位像素格式和RGB 顏色空間谴轮,你應(yīng)該將這個(gè)值設(shè)為8.
unsigned char pixelData[4] = {0, 0, 0, 0};? //初始化像素信息
//創(chuàng)建位圖文件環(huán)境。位圖文件可自行百度 bitmap
CGContextRef context = CGBitmapContextCreate(pixelData,
1,
1,
bitsPerComponent,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); //指定bitmap是否包含alpha通道黎比,像素中alpha通道的相對(duì)位置,像素組件是整形還是浮點(diǎn)型等信息的字符串鸳玩。
CGColorSpaceRelease(colorSpace);
CGContextSetBlendMode(context, kCGBlendModeCopy); //當(dāng)一個(gè)顏色覆蓋上另外一個(gè)顏色阅虫,兩個(gè)顏色的混合方式
CGContextTranslateCTM(context, -pointX, pointY - (CGFloat)height);? //改變畫布位置
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height ), cgImage);? //繪制圖片
CGContextRelease(context);
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;
pointColor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
return pointColor;}


- (void)setImage:(UIImage *)image {

UIImage *temp = [self imageForResizeWithImage:image resize:CGSizeMake(self.frame.size.width, self.frame.size.width)];

[super setImage:temp];

}

- (UIImage *)imageForResizeWithImage:(UIImage *)picture resize:(CGSize)resize {

CGSize imageSize = resize; //CGSizeMake(25, 25)

UIGraphicsBeginImageContextWithOptions(imageSize, NO,0.0);

CGRect imageRect = CGRectMake(0.0, 0.0, imageSize.width, imageSize.height);

[picture drawInRect:imageRect];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

return image;

}

百度網(wǎng)盤鏈接: https://pan.baidu.com/s/1bpq1y4v 密碼: bk9p

感謝作者:GitHub: https://github.com/Zws-China/WSColorPicker

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市不跟,隨后出現(xiàn)的幾起案子颓帝,更是在濱河造成了極大的恐慌,老刑警劉巖躬拢,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躲履,死亡現(xiàn)場離奇詭異,居然都是意外死亡聊闯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門米诉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菱蔬,“玉大人,你說我怎么就攤上這事史侣∷┟冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵惊橱,是天一觀的道長蚪腐。 經(jīng)常有香客問我,道長税朴,這世上最難降的妖魔是什么回季? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮正林,結(jié)果婚禮上泡一,老公的妹妹穿的比我還像新娘。我一直安慰自己觅廓,他們只是感情好鼻忠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杈绸,像睡著了一般帖蔓。 火紅的嫁衣襯著肌膚如雪矮瘟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天塑娇,我揣著相機(jī)與錄音澈侠,去河邊找鬼。 笑死钝吮,一個(gè)胖子當(dāng)著我的面吹牛埋涧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奇瘦,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼棘催,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耳标?” 一聲冷哼從身側(cè)響起醇坝,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎次坡,沒想到半個(gè)月后呼猪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砸琅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年宋距,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片症脂。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谚赎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诱篷,到底是詐尸還是另有隱情壶唤,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布棕所,位于F島的核電站闸盔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琳省。R本人自食惡果不足惜迎吵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岛啸。 院中可真熱鬧钓觉,春花似錦、人聲如沸坚踩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至批幌,卻和暖如春础锐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荧缘。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工皆警, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人截粗。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓信姓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绸罗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子意推,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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