获取单击图标选颜色

Posted huangyan1022

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取单击图标选颜色相关的知识,希望对你有一定的参考价值。

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;
//}

以上是关于获取单击图标选颜色的主要内容,如果未能解决你的问题,请参考以下文章

单击动画并更改图标的颜色

单击时更改字体真棒图标的颜色:CSS / JavaScript

如何在颤动中更改特定的图标颜色?

更改 SearchView 上的工具栏颜色/样式单击

单击 extjs 网格操作列内的图标时需要更改图标

悬停时可折叠图标/内容颜色更改