У меня есть этот код для маскировки изображения. В основном, я работаю только с изображениями PNG. Итак, у меня есть PNG-изображение 300x400 с 24-битным цветом (PNG-24). Я не уверен, что у него также есть альфа-канал. Но в этом нет прозрачности.Любая идея, почему этот код маскировки изображений не работает?
Затем есть маска изображения, которая является PNG-8 бит без альфа-канала. Он просто черный, полутоновый и белый.
Я создаю оба изображения как UIImage. Оба дисплея отображаются правильно, когда помещаются в UIImageView.
Затем я создаю UIImage из них, содержащий результаты операции маскирования, с этим кодом:
+ (UIImage*)maskImage:(UIImage*)image withMask:(UIImage*)maskImage {
CGImageRef maskRef = maskImage.CGImage;
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
CGImageGetHeight(maskRef),
CGImageGetBitsPerComponent(maskRef),
CGImageGetBitsPerPixel(maskRef),
CGImageGetBytesPerRow(maskRef),
CGImageGetDataProvider(maskRef), NULL, false);
CGImageRef masked = CGImageCreateWithMask([image CGImage], mask);
return [UIImage imageWithCGImage:masked];
}
вот что я с этим делать:
UIImage *image = [UIImage imageNamed:@"coloredImagePNG24.png"];
UIImage *maskImage = [UIImage imageNamed:@"theMaskPNG8_Grayscale_NoAlpha.png"];
UIImage *maskedImage = [MyGraphicUtils maskImage:image withMask:maskImage];
UIImageView *testImageView = [[UIImageView alloc] initWithImage:maskedImage];
testImageView.backgroundColor = [UIColor clearColor];
testImageView.opaque = NO;
После всего этого, colorImagePNG24.png остается полностью неповрежденным, как есть. Никакой маскировки не происходит. Но теперь странно: если я поверну это, то используйте это изображение как маску, а маску, как цветное изображение для маски, тогда я получаю что-то очень уродливое в оттенках серого (но в масках;)).
Любая идея, что не так с моим кодом?
ОБНОВЛЕНИЕ: Я просто искал Google для другого ч/б png, чтобы использовать его в качестве маски. А потом это сработало! Но тот, который я сделал сам, не работает. Поэтому я предполагаю, что код имеет большие проблемы декодирования изображений. Я должен «нормализовать» изображения в определенном формате, чтобы он работал.
Хотя это выглядит красиво, в моем случае он просто делает изображение полностью прозрачным. См. Мое обновление выше. Я понял что-то странное. – Thanks
Я использовал вариант на приведенном выше коде с масками, созданными в Photoshop, преобразованными в «Оттенки серого» и экспортированными как 24-битные PNG. – Ramin
Если вы хотите использовать вышеуказанный код, убедитесь, что ваши файлы изображений, содержащие маску, являются 24-разрядными PNG, которые не имеют альфа-канала. Pixelmator, например, не сообщает вам эту информацию. Вам нужно использовать Photoshop или Gimp. –