Я создал такой контекст (упрощенно):
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate (bitmapData,
pixWide,
pixHeigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
Теперь, когда я пытаюсь извлечь данные для первого пикселя в моем PNG с помощью Alphatransparency, он имеет очень странные альфа-значения. У меня есть простой PNG, это квадрат. На каждом краю я обрезал 10х10 пикселей и сделал их полностью прозрачными. Альфа там не должна быть чем-то вроде 153.
В CGImage.h объявлен kCGImageAlphaOnly. Док говорит:
kCGImageAlphaOnly Нет цвета
данные, только альфа-канал.
Хорошо, так что на самом деле это звучит хорошо, потому что мне нужны только альфа-данные, и ничего больше. Но это вызывает некоторые вопросы в моей голове. Если у меня есть полностью оборудованный PNG с кучей цветов + альфа: будет ли эта константа обеспечивать преобразование моего PNG в соответствии с этим цветовым пространством? Или мне нужно предоставить PNG, который соответствует указанному цветовому пространству?
Редактировать: я пытался использовать kCGImageAlphaOnly, но я получаю эту ошибку:
<Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 0-component colorspace; kCGImageAlphaOnly; 55 bytes/row.
В чем здесь проблема? Я уточнил это раньше:
size_t pixelsWide = CGImageGetWidth(inImage);
size_t pixelsHigh = CGImageGetHeight(inImage);
bitmapBytesPerRow = (pixelsWide * 1); // not * 4, because I just want alpha
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
Редактировать: я читал это минуту назад:
PNG, которые добавляются в XCode,
оптимизировано pngcrush во время
сборник. Это делает некоторые
обмен байтами (от RGBA к BRGA) и
предварительное умножение альфа.
Я предполагаю, что это предварительное умножение альфа создает проблемы.
Редактировать: альфа-канал остается неизменным после того, как pngcrunch сделал замену байтов в PNG. Так как мне не важны цвета, только альфа, то предварительное умножение не должно быть слишком большой проблемой, я думаю.
Мои PNG были 24-битными PNG, я добавил их в Xcode.