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();
}

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

(0)

相关推荐

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

    本文实例讲解了iOS从背景图中取色的代码,分享给大家供大家参考,具体内容如下 实现代码: void *bitmapData; //内存空间的指针,该内存空间的大小等于图像使用RGB通道所占用的字节数. static CGContextRef CreateRGBABitmapContext (CGImageRef inImage) { CGContextRef context = NULL; CGColorSpaceRef colorSpace; int bitmapByteCount; int

  • angular4模块中给标签添加背景图的实现方法

    一.现象 一个全屏的"走马灯"每项需要添加背景图,在循环标签里需要动态添加行内样式 二.解决 1.首先有一个图片数组,如: export class AppComponent { array = ["url(/assets/images/img1.png)","url(/assets/images/img2.png)"]; } 2.模块中添加数据,如: <div nz-carousel-content *ngFor="let it

  • 关于Vue背景图打包之后访问路径错误问题的解决

    案例环境 通过vue-cli脚手架创建的vue项目 在项目打包的时候遇到了背景图片路径出错的问题,经过谷歌一番,发现是在配置的时候对图片的限制大小过小造成的 首先,出错点在url-loader上面. // url-loader配置 // build/webpck.base.conf.js { test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, loader: 'url-loader', query: { limit: 10000, name: utils.assetsP

  • 利用java实现二维码和背景图的合并

    背景介绍: 最近我们这边需要做一个自动生成二维码并且还要将二维码嵌入现有的背景模板中,一直又没写过这些方面的东西,突然写还真是有点迷糊,特别是对于java图片API并不很熟悉,所以参考了很多网友的分享,很快做出来了,现在分享一下 注意: 关于二维码的生成方式在文章java生成带logo的多彩二维码已经写过了,大家可以合起来一起使用. 实例代码: BufferedImage image= bim;//二维码 BufferedImage bg= ImageIO.read(路径);//获取北京图片 G

  • iOS 解决按钮背景图片拉伸问题(推荐)

    问题如图: 设置按钮的背景图片被拉伸 解决方案 - (void)awakeFromNib { [super awakeFromNib]; //让背景图片不要拉伸 UIImage *image = _loginRegisterBtn.currentBackgroundImage; image = [image stretchableImageWithLeftCapWidth:image.size.width / 2 topCapHeight:image.size.height / 2]; [_lo

  • jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法

    本文实例讲述了jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法.分享给大家供大家参考,具体如下: 1.问题背景 设计一条折线图,但是图形中不用插件自带的颜色,需要自定义线条和折点的颜色 2.实现源码 (1)图形自分配颜色 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>echarts-设置折线图中折线线条颜色和折线点颜色</t

  • Android编程简单实现ImageView点击时背景图修改的方法

    本文实例讲述了Android编程简单实现ImageView点击时背景图修改的方法.分享给大家供大家参考,具体如下: 在使用ImageView时,当被点击时,希望背景图修改一下,这样显示被点击效果明显一些.在这里,一个很简单的方法,最起码是个很清晰的方法.在res/drawable文件夹下创建一个xml文件.比如my.xml,内容如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:an

  • Android编程之书架效果背景图处理方法

    本文实例讲述了Android编程之书架效果背景图处理方法.分享给大家供大家参考,具体如下: 在android应用中,做一个小说阅读器是很多人的想法,大家一般都是把如何读取大文件,如果在滚动或是翻页时,让用户感觉不到做为重点.我也在做一个类似一功能,可是在做书架的时候,看了QQ阅读的书架,感觉很好看,就想做一个,前面一篇<android书架效果实现原理与代码>对此做了专门介绍,其完整实例代码可点击此处本站下载. 上面的例子很不错,可是有一个问题是他的背景图的宽必须是手机屏幕的宽,不会改变,这样感

  • C#使用iTextSharp设置PDF所有页面背景图功能实例

    本文实例讲述了C#使用iTextSharp设置PDF所有页面背景图功能的方法.分享给大家供大家参考.具体如下: 在生成PDF 的时候,虽然可以在页面中设置背景图. 但有些内容过长夸页面的时候,就很难设置背景图,变成了空白背景的页面! 以下是重新生成每一页 PDF 背景图功能代码! public void SetPdfBackground(string pdfFilePath) { //重新生成的 PDF 的路径 string destFile = HttpContext.Current.Serv

  • Android实战打飞机游戏之无限循环的背景图(2)

    首先分析下游戏界面内的元素: 无限滚动的背景图, 可以操作的主角,主角的子弹, 主角的血量,两种怪物(敌机),一个boss, boss的爆炸效果. 先看效果图 1.首先实现无限滚动的背景图 原理: 定义两个位图对象 当第一个位图到末尾是 第二个位图从第一个位图的末尾跟上. public class GameBg { // 游戏背景的图片资源 // 为了循环播放,这里定义两个位图对象, // 其资源引用的是同一张图片 private Bitmap bmpBackGround1; private B

随机推荐