您的位置:首页 > 产品设计 > UI/UE

iOS 获取图片某一点的颜色对象(UIColor*)。

2014-05-08 17:43 375 查看
- (UIColor *)colorAtPixel:(CGPoint)point {

    // Cancel if point is outside image coordinates

    if (!CGRectContainsPoint(CGRectMake(0.0f,
0.0f, self.size.width,
self.size.height), point)) {

        return nil;

    }

    NSInteger pointX =
trunc(point.x);

    NSInteger pointY =
trunc(point.y);

    CGImageRef cgImage =
self.CGImage;

    NSUInteger width =
self.size.width;

    NSUInteger height =
self.size.height;

    CGColorSpaceRef colorSpace =
CGColorSpaceCreateDeviceRGB();

    int bytesPerPixel =
4;

    int bytesPerRow = bytesPerPixel *
1;

    NSUInteger bitsPerComponent =
8;

    unsigned char pixelData[4] = {
0, 0,
0, 0 };

    CGContextRef context =
CGBitmapContextCreate(pixelData, 

                                                 1,

                                                 1,

                                                 bitsPerComponent, 

                                                 bytesPerRow, 

                                                 colorSpace,

                                                 kCGImageAlphaPremultipliedLast |
kCGBitmapByteOrder32Big);

    CGColorSpaceRelease(colorSpace);

    CGContextSetBlendMode(context,
kCGBlendModeCopy);

    // Draw the pixel we are interested in onto the bitmap context

    CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);

    CGContextDrawImage(context,
CGRectMake(0.0f,
0.0f, (CGFloat)width, (CGFloat)height), cgImage);

    CGContextRelease(context);

    

    // Convert color values [0..255] to floats [0.0..1.0]

    CGFloat red   = (CGFloat)pixelData[0] /
255.0f;

    CGFloat green = (CGFloat)pixelData[1] /
255.0f;

    CGFloat blue  = (CGFloat)pixelData[2] /
255.0f;

    CGFloat alpha = (CGFloat)pixelData[3] /
255.0f;

    return [UIColor
colorWithRed:red green:green
blue:blue alpha:alpha];

}

UIImage+ColorAtPixel.h

#import <UIKit/UIKit.h>

/*
A category on UIImage that enables you to query the color value of arbitrary
pixels of the image.
*/
@interface UIImage (ColorAtPixel)

- (UIColor *)colorAtPixel:(CGPoint)point;

@end

#import <CoreGraphics/CoreGraphics.h>

#import "UIImage+ColorAtPixel.h"

@implementation UIImage (ColorAtPixel)

- (UIColor *)colorAtPixel:(CGPoint)point {
// Cancel if point is outside image coordinates
if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) {
return nil;
}

NSInteger pointX = trunc(point.x);
NSInteger pointY = trunc(point.y);
CGImageRef cgImage = self.CGImage;
NSUInteger width = self.size.width;
NSUInteger height = self.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
int bytesPerPixel = 4;
int bytesPerRow = bytesPerPixel * 1;
NSUInteger bitsPerComponent = 8;
unsigned char pixelData[4] = { 0, 0, 0, 0 };
CGContextRef context = CGBitmapContextCreate(pixelData,
1,
1,
bitsPerComponent,
bytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextSetBlendMode(context, kCGBlendModeCopy);

// Draw the pixel we are interested in onto the bitmap context
CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height);
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage);
CGContextRelease(context);

// Convert color values [0..255] to floats [0.0..1.0]
CGFloat red = (CGFloat)pixelData[0] / 255.0f;
CGFloat green = (CGFloat)pixelData[1] / 255.0f;
CGFloat blue = (CGFloat)pixelData[2] / 255.0f;
CGFloat alpha = (CGFloat)pixelData[3] / 255.0f;
return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
}

@end

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: