Вот очень простой сценарий класса для работы с изображением в виде растрового изображения.Когда вы создаете этот объект с
ImageBitmap * imageBitmap = [[ImageBitmap alloc] initWithImage:myImageView.image bitmapInfo:kCGImageAlphaNoneSkipLast];
Вы можете получить доступ к любому пикселю в (x, y) как
Byte * pixel = [imageBitmap pixelAtX:x Y:y];
RGB-компонентам на 0, 1, 2 байта, поэтому
Byte red = pixel[0]; etc.
вы можете как читать, так и записывать пиксели, например, установите удалить зеленый компонент из пикселя:
pixel[1] = 0;
, если использовать kCGImageAlphaPremultipliedLast pixel [3] имеет альфа
//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