码迷,mamicode.com
首页 > 其他好文 > 详细

获取单击图标选颜色

时间:2016-05-25 23:59:41      阅读:364      评论:0      收藏:0      [点我收藏+]

标签:

CGContextRef CGBitmapContextCreate (
  void *data,
  size_t width,
  size_t height,
  size_t bitsPerComponent,
  size_t bytesPerRow,
  CGColorSpaceRef colorspace,
  CGBitmapInfo bitmapInfo
  );
 
 参数data指向绘图操作被渲染的内存区域,这个内存区域大小应该为(bytesPerRow*height)个字节。如果对绘制操作被渲染的内存区域并无特别的要求,那么可以传递NULL给参数date。
   参数width代表被渲染内存区域的宽度。
   参数height代表被渲染内存区域的高度。
   参数bitsPerComponent被渲染内存区域中组件在屏幕每个像素点上需要使用的bits位,举例来说,如果使用32-bit像素和RGB颜色格式,那么RGBA颜色格式中每个组件在屏幕每个像素点上需要使用的bits位就为32/4=8。
   参数bytesPerRow代表被渲染内存区域中每行所使用的bytes位数。
   参数colorspace用于被渲染内存区域的“位图上下文”。
   参数bitmapInfo指定被渲染内存区域的“视图”是否包含一个alpha(透视)通道以及每个像素相应的位置,除此之外还可以指定组件式是浮点值还是整数值。
 

获取图片中单个点的颜色:

- (UIColor*) getPixelColorAtLocation:(CGPoint)point {
   UIColor* color = nil;
   CGImageRef inImage = self.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));//用8或4
           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 {
       }

   }
   // When finished, release the context
   CGContextRelease(cgctx); 
   // Free image data memory for the context
   if (data) { free(data); }

   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 space\n");
       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;
}
//-(UIImage*)ImageUtils_GetImageFromView:(UIView*)view {
//    // start a context with the same size of view
//    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0);
//   
//    // render the view layer into the context
//    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
//   
//    // store into the UIImage
//    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
//   
//    // close the context
//    UIGraphicsEndImageContext();
//   
//    return img;
//}

获取单击图标选颜色

标签:

原文地址:http://www.cnblogs.com/hangman/p/5529046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!