J'ai une image qui est dans une vue d'image. Je veux trouver la couleur d'un pixel spécifique (disons x = 10, y = 20) à l'intérieur de l'image. Le code de travail m'aiderait vraiment.Comment déterminer "Couleur d'un pixel spécifique" dans une image?
Répondre
Cela dépend beaucoup du type d'image :)
Si vous avez les données octet, et vous savez comment il est disposé, par exemple PNG utilise RGBA alors vous avez une jambe.
L'utilisation libérale de tous les CGImageFunctions comme CGImageGetBitsPerComponent et CGImageGetColorSpace sera votre guide.
Pour obtenir les données octet réel, CGImageDestinationCreateWithData Crée une destination d'image qui écrit à un objet de données Core Foundation mutable (NSMutableData */CFMutableDataRef)
Si tout cela est du charabia, commencez par le Quart2D Programming Guide.
Voici un squelette très simple de classe pour travailler avec l'image en tant que bitmap. Lorsque vous créez cet objet avec
ImageBitmap * imageBitmap = [[ImageBitmap alloc] initWithImage:myImageView.image bitmapInfo:kCGImageAlphaNoneSkipLast];
Vous pouvez accéder à un pixel (x, y) comme
Byte * pixel = [imageBitmap pixelAtX:x Y:y];
composantes RVB à 0, 1, 2 octets si
Byte red = pixel[0]; etc.
vous pouvez lire ou écrire des pixels, par exemple définir supprimer le composant vert du pixel:
pixel[1] = 0;
si pixel utilisation de kCGImageAlphaPremultipliedLast [3] est l'alpha
//ImageBitmap.h
@interface ImageBitmap : NSObject {
int height, width;
void * contextData;
CGContextRef context;
CGBitmapInfo bitmapInfo;
}
@property(assign) int height;
@property(assign) int width;
@property(readonly) CGContextRef context;
@property(readonly) void * contextData;
-(id)initWithSize:(CGSize)size bitmapInfo:(CGBitmapInfo)bmInfo;
-(id)initWithImage:(UIImage *)image bitmapInfo:(CGBitmapInfo)bmInfo;
-(CGContextRef)createBitmapContextWithData:(void *)data;
- (UIImage *)imageFromContext;
-(Byte *)pixelAtX:(NSInteger)pixelX Y:(NSInteger)pixelY;
//ImageBitmap.m
#import "ImageBitmap.h"
@implementation ImageBitmap
@synthesize width, height;
@synthesize context, contextData;
-(id)initWithSize:(CGSize)size bitmapInfo:(CGBitmapInfo)bmInfo{
if (self = [super init]) {
height = size.height;
width = size.width;
contextData = malloc(width * height * 4);
bitmapInfo = bmInfo;
context = [self createBitmapContextWithData:contextData];
}
return self;
}
-(id)initWithImage:(UIImage *)image bitmapInfo:(CGBitmapInfo)bmInfo{
[self initWithSize:image.size bitmapInfo:bmInfo];
CGContextDrawImage(context, CGRectMake(0, 0, width, height),image.CGImage);
return self;
}
-(CGContextRef) createBitmapContextWithData:(void *)data{
CGContextRef ctx = NULL;
int bitmapBytesPerRow = (width * 4);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (data == NULL){
return NULL;
}
ctx = CGBitmapContextCreate (data,
width,
height,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
bitmapInfo); //kCGImageAlphaNoneSkipLast or kCGImageAlphaPremultipliedLast
CGColorSpaceRelease(colorSpace);
return ctx;
}
- (UIImage *)imageFromContext{
CGImageRef cgImage = CGBitmapContextCreateImage(context);
return [UIImage imageWithCGImage:cgImage];
}
-(Byte *)pixelAtX:(NSInteger)pixelX Y:(NSInteger)pixelY{
return (Byte *)contextData + (width * pixelY + pixelX)*4;
}
@end
Voir [cette question] (http://stackoverflow.com/questions/3142178/nsbitmapimagerep-for-iphone-or-direct-pixel-access -pour-cgimage/3142338 # 3142338) – drawnonward