Создание маски из графического контекста - PullRequest
1 голос
/ 27 апреля 2010

Я хочу иметь возможность создавать изображение в градациях серого без альфа-канала из png в комплекте приложения.

Это работает, и я получаю изображение, созданное:

// Create graphics context the size of the overlapping rectangle
UIGraphicsBeginImageContext(rectangleOfOverlap.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();

// More stuff

CGContextDrawImage(ctx, drawRect2, [UIImage imageNamed:@"Image 01.png"].CGImage);

// Create the new UIImage from the context
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

Однако результирующее изображение имеет размер 32 бита на пиксель и имеет альфа-канал, поэтому, когда я использую CGCreateImageWithMask, оно не работает. Я попытался создать растровый контекст таким образом:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef ctx =CGBitmapContextCreate(nil, rectangleOfOverlap.size.width, rectangleOfOverlap.size.height, 8, rectangleOfOverlap.size.width , colorSpace, kCGImageAlphaNone);

UIGraphicsGetImageFromCurrentImageContext возвращает ноль, и результирующее изображение не создается. Я делаю что-то глупое здесь?

Любая помощь будет принята с благодарностью.

Привет

Дейв

1 Ответ

0 голосов
/ 29 апреля 2010

ОК, думаю, у меня есть ответ (или несколько из них) ...

Если создание контекста завершается неудачно, в окне консоли выдается разумное сообщение об ошибке и сообщается, почему это не удалось. В этом случае контекст создается, поэтому нет ошибки.

Во-вторых, список поддерживаемых параметров для CGBtimapContext находится здесь: http://developer.apple.com/mac/library/qa/qa2001/qa1037.html

В-третьих, UIGraphicsGetImageFromCurrentImageContext () работает только с общим контекстом, созданным с помощью UIGraphicsBeginGraphicsContext (), который мне нужно было использовать:

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

и, в-четвертых, я не могу получить данные базовых пикселей с помощью CGBitmapContextGetData (ctx), если я создаю контекст, используя NULL в качестве первого параметра, хотя в документах подразумевается, что память начиная с версии 10.3 обрабатывается для вас. Чтобы обойти это, я создал метод под названием:

- (CGContextRef) newGreyScaleBitmapContextOfSize:(CGSize) size;

Метод создает контекст путем malloc'ing памяти и возвращает контекст ref. Я не уверен, является ли это всеобъемлющим, но поскольку я потратил несколько дней на это, я подумал, что дам вам знать, что я обнаружил до сих пор.

Надеюсь, это поможет,

Dave

...