IOS - получить двоичную маску (битовую маску) из UIBeizerPath
Я создаю приложение IOS. В моем приложении у меня есть изображение, которое пользователь может обрезать вручную. После того, как пользователь обрезает изображение, я хочу сохранить информацию о маске в двоичном виде.
Мне нужно, чтобы это было двоичное изображение, а не только как форма NSCoding, так как мне нужно будет использовать информацию о маске на других платформах (не только IOS).
Как я могу преобразовать UIBezierPath в массив двоичной маски.
1 ответ
Во-первых, вы должны растеризовать (обвести / заполнить) ваш UIBeizerPath до контекста вашего изображения, а затем вы можете манипулировать его растровыми данными. Вот пример того, как растеризовать UILabel:
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, siz.w, siz.h)];
label.text = [[NSString alloc] ... ];
label.font = [UIFont boldSystemFontOfSize: ... ];
UIGraphicsBeginImageContext(label.frame.size);
[label.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* layerImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Get Image size
GLuint width = CGImageGetWidth(layerImage.CGImage);
GLuint height = CGImageGetHeight(layerImage.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// Allocate memory for image
void *imageData = malloc( height * width * 4 );
CGContextRef imgcontext = CGBitmapContextCreate(
imageData, width, height, 8, 4 * width, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Little );
CGColorSpaceRelease( colorSpace );
CGContextClearRect( imgcontext,
CGRectMake( 0, 0, width, height ) );
CGContextTranslateCTM( imgcontext, 0, height - height );
CGContextDrawImage( imgcontext,
CGRectMake( 0, 0, width, height ), layerImage.CGImage );
// Create image
[.. here you can do with imageData whatever you want ..]
image.InitImage(imageData, width * height * 4, width, height, iResource_Image::ImgFormat_RGBA32);
// Release context
CGContextRelease(imgcontext);
free(imageData);
[label release];