Цель C: CGBitmapContextCreate, попиксельная обработка

Прежде всего извините за мой английский. Я занимаюсь рисованием iOS-приложения. Я решил использовать попиксельную обработку изображения. Нужно создавать сложные "кистевые" инструменты. Я использовал этот алгоритм.

Мой код:

ViewController.h

#import <UIKit/UIKit.h>

@interface MVRViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) UIImage *image;

@end

ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

    self.image = [UIImage imageNamed:@"grid_750x450.png"];
    self.imageView.image = self.image;
}


-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSSet *allTouches = [event allTouches];
    UITouch *touch = [[allTouches allObjects] objectAtIndex:0];


    CGPoint imageViewPoint = [touch locationInView:self.imageView];

    if ((imageViewPoint.x < self.imageView.frame.size.width) && (self.imageViewPoint.y < imageView.frame.size.height)) {

        // Create image buffer
        CGContextRef ctx;
        CGImageRef imageRef = [self.image CGImage];
        NSUInteger width = CGImageGetWidth(imageRef);
        NSUInteger height = CGImageGetHeight(imageRef);
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
        unsigned char *rawData = malloc(height * width * 4);
        NSUInteger bytesPerPixel = 4;
        NSUInteger bytesPerRow = bytesPerPixel * width;
        NSUInteger bitsPerComponent = 8;
        CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                                     bitsPerComponent, bytesPerRow, colorSpace,
                                                     kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
        CGColorSpaceRelease(colorSpace);

        CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
        CGContextRelease(context);


        // Do something with image buffer
        int X = imageViewPoint.x;
        int Y = imageViewPoint.y;

        for (int X1=X-14; ((X1<X+14) && (X1<width)); X1++) {
            for (int Y1=Y-14; ((Y1<Y+14) && (Y1<height)); Y1++) {

                int byteIndex = (bytesPerRow * Y1) + X1 * bytesPerPixel;

                rawData[byteIndex]=255; // new red
                rawData[byteIndex+1]=0; // new green
                rawData[byteIndex+2]=0; // new blue
            }
        }

        // Save image buffer to UIImage
        ctx = CGBitmapContextCreate(rawData,
                                    CGImageGetWidth( imageRef ),
                                    CGImageGetHeight( imageRef ),
                                    8,
                                    CGImageGetBytesPerRow( imageRef ),
                                    CGImageGetColorSpace( imageRef ),
                                    kCGImageAlphaPremultipliedLast );

        imageRef = CGBitmapContextCreateImage (ctx);
        UIImage* rawImage = [UIImage imageWithCGImage:imageRef];  

        CGContextRelease(ctx);  

        self.image = rawImage;
        self.imageView.image = self.image;

        CGImageRelease(imageRef);

        free(rawData);
    }
}

Приложение это работа. Но...

Моя проблема: приложение было сбой из-за ошибки памяти (на устройстве). Из инструментов (профиль распределения) я вижу, что unsigned char *rawData = malloc(height * width * 4); никогда не выпускается и free(rawData) функция не сработала, наверное. На симуляторе рост памяти до "бесконечности" (3Gb...).

Где я не прав? Спасибо!

0 ответов

Другие вопросы по тегам