iOS实现从背景图中取色的代码_IOS

本文实例讲解了iOS从背景图中取色的代码,分享给大家供大家参考,具体内容如下

实现代码:

void *bitmapData; //内存空间的指针,该内存空间的大小等于图像使用RGB通道所占用的字节数。

static CGContextRef CreateRGBABitmapContext (CGImageRef inImage)
{
  CGContextRef context = NULL;
  CGColorSpaceRef colorSpace;
  int bitmapByteCount;
  int bitmapBytesPerRow;

  size_t pixelsWide = CGImageGetWidth(inImage); //获取横向的像素点的个数
  size_t pixelsHigh = CGImageGetHeight(inImage);

  bitmapBytesPerRow  = (pixelsWide * 4); //每一行的像素点占用的字节数,每个像素点的ARGB四个通道各占8个bit(0-255)的空间
  bitmapByteCount = (bitmapBytesPerRow * pixelsHigh); //计算整张图占用的字节数

  colorSpace = CGColorSpaceCreateDeviceRGB();//创建依赖于设备的RGB通道
  //分配足够容纳图片字节数的内存空间
  bitmapData = malloc( bitmapByteCount );
  //创建CoreGraphic的图形上下文,该上下文描述了bitmaData指向的内存空间需要绘制的图像的一些绘制参数
  context = CGBitmapContextCreate (bitmapData,
                   pixelsWide,
                   pixelsHigh,
                   8,
                   bitmapBytesPerRow,
                   colorSpace,
                   kCGImageAlphaPremultipliedLast);
  //Core Foundation中通过含有Create、Alloc的方法名字创建的指针,需要使用CFRelease()函数释放
  CGColorSpaceRelease( colorSpace );
  return context;
}

// 返回一个指针,该指针指向一个数组,数组中的每四个元素都是图像上的一个像素点的RGBA的数值(0-255),用无符号的char是因为它正好的取值范围就是0-255
static unsigned char *RequestImagePixelData(UIImage *inImage)
{
  CGImageRef img = [inImage CGImage];
  CGSize size = [inImage size];
  //使用上面的函数创建上下文
  CGContextRef cgctx = CreateRGBABitmapContext(img);
  CGRect rect = {{0,0},{size.width, size.height}};
  //将目标图像绘制到指定的上下文,实际为上下文内的bitmapData。
  CGContextDrawImage(cgctx, rect, img);
  unsigned char *data = CGBitmapContextGetData (cgctx);
  //释放上面的函数创建的上下文
  CGContextRelease(cgctx);
  return data;
}

//设置背景原图片,即取色所用的图片
- (void)setSourceImage:(NSString *)sourceImage ImageWidth:(int)_width ImageHeight:(int)_height {
  //生成指定大小的背景图
  UIImage *im = [UIImage imageNamed:sourceImage];
  UIImage *newImage;
  UIImageView *view = [[UIImageView alloc] initWithImage:im];
  view.frame = CGRectMake(0, 0, _width, _height);
  UIGraphicsBeginImageContext(CGSizeMake(_width, _height)); //size 为CGSize类型,即你所需要的图片尺寸
  [im drawInRect:CGRectMake(0, 0, _width, _height)]; //newImageRect指定了图片绘制区域
  newImage = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  width = newImage.size.width;
  height = newImage.size.height;
  //将解析背景图为像素,供取色用
  imgPixel = RequestImagePixelData(newImage);
}

//计算颜色
-(UIColor*)calColor:(CGPoint)aPoint {
  int i = 4 * width * round(aPoint.y+imageView.frame.size.height/2) + 4 * round(aPoint.x+imageView.frame.size.width/2);
  int _r = (unsigned char)imgPixel[i];
  int _g = (unsigned char)imgPixel[i+1];
  int _b = (unsigned char)imgPixel[i+2];
  NSLog(@"(%f,%f)",aPoint.x,aPoint.y);
  NSLog(@"Red : %f  Green: %f  Blue: %f",_r/255.0,_g/255.0,_b/255.0);
  return [UIColor colorWithRed:_r/255.0f green:_g/255.0f blue:_b/255.0f alpha:1.0];
}  

- (void)changColor:(UIColor *)color{
  int width_;
  if (![Util isIpad]) {
    width_ = 30;
  } else {
    width_ = 70;
  }

  UIGraphicsBeginImageContext(CGSizeMake(width_, width_));
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  CGContextMoveToPoint(ctx, 20, 20);
  CGContextSetFillColorWithColor(ctx, color.CGColor);
  if (![Util isIpad]) {
    CGContextAddArc(ctx, width_/2, width_/2, 14.5, 0, 6.3, 0);
  } else {
    CGContextAddArc(ctx, width_/2+0.5, width_/2, 31.3, 0, 6.3, 0);
  }
  CGContextFillPath(ctx);
  self->pickedColorImageView.image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索iOS背景图中取色
iOS取色
ios 取色代码、ios登录注册实现代码、ios闹钟实现代码、ios计步器代码实现、ios 代码实现键盘横屏,以便于您获取更多的相关知识。

时间: 2024-12-30 16:44:50

iOS实现从背景图中取色的代码_IOS的相关文章

sql-为什么图中的SQL代码,from里面不用填其中一个来源表呢?

问题描述 为什么图中的SQL代码,from里面不用填其中一个来源表呢? 为什么图中的代码, 子查询里面的from只有orders这个表没有customers这个表呢? 我觉得括号里面from应该有customers,是因为我觉得SQL会先运行括号里面的内容.但实际顺序是怎样的呢? 解决方案 你这是SELECT里面的子查询,表示用customers.cust_id到orders里面去查找相关的订单数量 并且这时候的子查询每次SELECT只能是出一个值,不允许在select中的子查询查找出多个值,或

求asp+access查询代码,实现图中要求的代码。

问题描述 求asp+access查询代码,实现图中要求的代码.

iOS AFNetworking中cookie重定向代码_IOS

// 1. 取出需要同步的url (登录请求中返回的重定向地址) BESTHttpItem *httpItem = [BESTHttpHelper sharedHelper].curHttpItem; NSString *url = [NSString stringWithFormat:@"%@/#/login", httpItem.frontend_addr]; // 2. 取出当前的headerFields NSDictionary *headerFields = [NSHTTPC

iOS消息推送原理及具体实现代码_IOS

一.消息推送原理 在实现消息推送之前先提及几个于推送相关概念,如下图1-1: 1.Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]): 2.APNS:Apple Push Notification Service[苹果消息推送服务器]: 3.iPhone:用来接收APNS下发下来的消息: 4.Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定

iOS计算上次日期距离现在多久的代码_IOS

本文实例为大家分享了iOS上次日期距离现在多久的计算代码,供大家参考,具体内容如下 /** * 计算上次日期距离现在多久 * * @param lastTime 上次日期(需要和格式对应) * @param format1 上次日期格式 * @param currentTime 最近日期(需要和格式对应) * @param format2 最近日期格式 * * @return xx分钟前.xx小时前.xx天前 */ + (NSString *)timeIntervalFromLastTime:(

iOS开发 widget构建详解及实现代码_IOS

iOS开发之widget实现 前言     iOS extension的出现,方便了用户查看应用的服务,比如用户可以在Today的widgets中查看应用的简略信息,然后点击进入相关的应用界面. 暂且不表网络上现有的widget文章,本篇文章主要说明本人具体实现widget的步骤,希望能够帮助到需要实现widget的同行朋友. 图1 Today的widget展示----以支付宝为例说明 文章将依次从以下几个问题着手,进行详细说明:1.如何为现有的工程添加widget:2.如何绘制UI:3.如何调

iOS 实现多代理的方法及实例代码_IOS

iOS实现多代理 什么是多代理 用过环信SDK的同学应该对多代理不陌生了,请看下面代码: @method @brief 注册一个监听对象到监听列表中 @discussion 把监听对象添加到监听列表中准备接收相应的事件 @param delegate 需要注册的监听对象 @param queue 通知监听对象时的线程 @result */ - (void)addDelegate:(id<EMChatManagerDelegate>)delegate delegateQueue:(dispatc

photoshop利用滤镜制作亚麻背景图教程

给各位photoshop软件的使用者们来详细的解析分享一下利用滤镜制作亚麻背景图的教程. 教程分享: 单击-文件-新建命令(Ctrl+N),新建一幅大小为1920*1080的RGB模式的空白图像.(大小以图片用途调整)   将前景色参数设置为c8aa64,背景色参数设置为aa9646.     单击-滤镜-渲染-云彩命令,生成云彩效果,如图所示     单击-滤镜-杂色-添加杂色命令,在对话框中设置-数量22,选择高斯分布和单色,效果如图所示.       单击-滤镜-滤镜库命令,在打开的对话框

求解,iOS中如何实现点击按钮切换按钮背景图,并且通过导航栏返回并再次进入后按钮还是那个背景图

问题描述 求解,iOS中如何实现点击按钮切换按钮背景图,并且通过导航栏返回并再次进入后按钮还是那个背景图 就是想在一个页面做一个收藏的按钮,如果用户点击按钮按钮的背景图就变成已收藏的背景图,并且保存这一状态,在下一次进入页面的时候还是已收藏的状态,求高手指点 解决方案 你这个没有数据交互么? 正常应该是用户点击收藏,然后后台提交,数据库响应成功后在回调里改变一下按钮状态和相应数据. 解决方案二: 你这个背景图片切换的数量多不?如果就2张图片来回切换,可以写个单例,记录下来你的点击状态,根据状态来