【iOS开发】获取图片某点或…

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  createARGBBitmapContextF romImage:inImage];
    if  (cgctx  ==  NULL)  return  nil;    }

    size_t  CGImageGetWidth(inImage);
    size_t  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  chardata  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.0fgreen:(green/ 255.0fblue:(blue/ 255.0falpha:(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)  createARGBBitmapContextF romImage:(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  CGColorSpaceCreateDevice RGB();

    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,
                                                                      kCGImageAlphaPremultipli edFirst);
    if  (context  ==  NULL)
    {
        free  (bitmapData);
        fprintf  (stderr,  "Context not created!");
    }
    // Make sure and release colorspace before returning
    CGColorSpaceRelease(  colorSpace  );
   
    return  context;
}
备忘。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值