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

来源:互联网 发布:暴躁的母亲知乎 编辑:程序博客网 时间:2024/06/14 12:38
原文地址:与 CGBitmapContextCreate">【iOS开发】获取图片某点或区域的颜色 与 CGBitmapContextCreate作者:一棵草Telen
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 screenbitmap context to draw the image into. Format ARGB is 4 bytes foreach pixel: Alpa, Red, Green, Blue
  CGContextRef cgctx [self createARGBBitmapContextFromImage:inImage];
   if (cgctx == NULL) return nil;  }

  size_t CGImageGetWidth(inImage);
  size_t CGImageGetHeight(inImage);
  CGRect rect {{0,0},{w,h}}; 

   // Draw the image tothe bitmap context. Once we draw, thememory 
   // allocated for thecontext for rendering will then containthe 
   // raw image data inthe specified color space.
  CGContextDrawImage(cgctx, rect, inImage); 

   // Now we can get apointer to the image data associated with the bitmap
   //context.
   unsigned chardata CGBitmapContextGetData (cgctx);
   if (data != NULL) {
      //offset locates thepixel in the data from x,y. 
      //4 for 4 bytes ofdata 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 datamemory 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 numberof bytes per row. Each pixel in the bitmap in this
   // example isrepresented by 4 bytes; 8 bits each of red, green, blue,and
   // alpha.
  bitmapBytesPerRow   (pixelsWide 4);
  bitmapByteCount    (bitmapBytesPerRow pixelsHigh);

   // Use the generic RGBcolor space.
  colorSpace CGColorSpaceCreateDeviceRGB();

   if (colorSpace == NULL)
   {
      fprintf(stderr, "Error allocating colorspacen");
      return NULL;
   }

   // Allocate memory forimage data. This is the destination in memory
   // where any drawingto the bitmap context will be rendered.
  bitmapData malloc( bitmapByteCount );
   if (bitmapData == NULL) 
   {
      fprintf (stderr, "Memorynot allocated!");
      CGColorSpaceRelease( colorSpace );
      return NULL;
   }

   // Create the bitmapcontext. We want pre-multiplied ARGB,8-bits 
   // per component.Regardless of what the source image formatis 
   // (CMYK, Grayscale,and so on) it will be converted over to the format
   // specified here byCGBitmapContextCreate.
  context CGBitmapContextCreate (bitmapData,
                                                         pixelsWide,
                                                         pixelsHigh,
                                                         8    // bits percomponent
                                                         bitmapBytesPerRow,
                                                         colorSpace,
                                                         kCGImageAlphaPremultipliedFirst);
   if (context == NULL)
   {
      free (bitmapData);
      fprintf (stderr, "Contextnot created!");
   }
   // Make sure andrelease colorspace before returning
  CGColorSpaceRelease( colorSpace );
   
   return context;
}
备忘。
0 0
原创粉丝点击