2010-07-03 9 views

Répondre

1

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.

0

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