まず、私の英語で申し訳ありません。私はペイント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 ...)に増加する場合。
どこが間違っていますか?ありがとうございました!