• 获取图片某点或区域的颜色 与 CGBitmapContext


    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));
               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 spacen");
           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;
    }
  • 相关阅读:
    符号表实现(Symbol Table Implementations)
    揭开枚举类的面纱(Unlocking the Enumeration/enum Mystery)
    玩转指针(Playing with Pointers)
    什么是空间复杂度(What is actually Space Complexity ?)
    论困于记忆之物(随笔感言)
    【未有之有】洛依文明相关
    告别
    【未有之有】洛森修炼体系整理
    【未有之有】洛森十三圣人
    复苏
  • 原文地址:https://www.cnblogs.com/wangbinios/p/5147408.html
Copyright © 2020-2023  润新知