• 获取单击图标选颜色


    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 ");
           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;
    //}
    一天一章
  • 相关阅读:
    windows下python开发环境搭建
    看看两年前的我
    网络函数[00]函数总述
    网络函数[04]connect解析
    网络函数[08]网络读取函数解析
    网络函数[01]套接口地址图解
    网络函数[13]
    网络函数[07]accept解析
    网络函数[10]shutdown解析
    网络函数[14]
  • 原文地址:https://www.cnblogs.com/hangman/p/5529046.html
Copyright © 2020-2023  润新知