2015-09-17 2 views
7

обновлен до Xcode 7 и получить это (предупреждение?) Сообщение в то время как изображение было быть вынесено в эксплуатацию:Получение сообщения в консоли: «CreateWrappedSurface() не удалось выполнить для CGImageRef с поддержкой данных».

CreateWrappedSurface() не для DataProvider спинками CGImageRef.

Не было такого сообщения под Xcode 6.4.

Got который часть кода бросил сообщение:

if (!self.originalImage) // @property (nonatomic, strong) UIImage *originalImage; 
     return; 

CGImageRef originalCGImage = self.originalImage.CGImage; 
NSAssert(originalCGImage, @"Cannot get CGImage from original image"); 
CIImage *inputCoreImage = [CIImage imageWithCGImage:originalCGImage]; // this results the console message 

Я заменил мой CIIImage создателя, чтобы получить его непосредственно из UIImage:

CIImage *originalCIImage = self.originalImage.CIImage; 
NSAssert(originalCIImage, @"Cannot build CIImage from original image"); 

В этом случае я не получил какой-либо консоли сообщение, но имело утверждение: originalCIImage был равен нулю.

Эталонный класс UIImage говорит:

@property (неатомической, только для чтения) CIImage * CIImage

Если объект UIImage был инициализирован с помощью CGImageRef, стоимость имущества равна нулю.

Поэтому я использую исходный код в качестве запасного варианта:

CIImage *originalCIImage = self.originalImage.CIImage; 
if (!originalCIImage) { 
    CGImageRef originalCGImageRef = self.originalImage.CGImage; 
    NSAssert(originalCGImageRef, @"Unable to get CGimageRef of originalImage"); 
    originalCIImage = [CIImage imageWithCGImage:originalCGImageRef]; 
} 
NSAssert(originalCIImage, @"Cannot build CIImage from original image"); 

Проблема заключается в том, что я по-прежнему получать предупреждающие сообщения в консоли.

Кто-нибудь получил это сообщение раньше? Каково решение проблемы с этим предупреждением (?)?

Спасибо, Адам

+0

Я начал получать это (iOS9), когда начал запускать свои CIFilters в фоновом потоке, потому что они настолько медленны (а также в autoReleasePool). Похоже, что это не вызывало каких-либо негативных последствий, просто это сообщение, но я все еще изучаю ответы. –

+0

Я, похоже, только на тренажере тоже, а не на устройстве. Hmmm –

+0

Просто конвертируйте свое изображение с RGB в RGBA –

ответ

8

Наконец понял, ответ. Любопытный ошибкой я проучился до того, как CIImage работает (https://uncorkedstudios.com/blog/image-filters-with-core-graphics)

я заметил, что CGImageRef является DataProvider спинками с предварительно умноженные значения (RGB и A)

Я подумал, что CGImage я загружается в CIImage (с использованием [CIImage imageWithCGImage:originalCGImage]; - это только RGB, а не RGBA). Конечно, я создавал это изображение, сделав снимок представления с использованием стандартного UIGraphicsBeginImageContextWithOptions, и у меня был непрозрачный параметр, установленный в «YES».

Я просто изменил:

UIGraphicsBeginImageContextWithOptions(bounds, YES, 1.0f);

в

UIGraphicsBeginImageContextWithOptions(bounds, NO, 1.0f);

Так что я сейчас создает RGBA изображение, а не RGB изображения.

Теперь я конвертирую свой CGImage в CIImage, а CIImage NOW имеет надлежащую поддержку датапровайдера, и ошибка уходит.


Примечание:

я использовал фильтр CIClamp для гауссовских целей размытия, а также с непрозрачным набором к NO зажим не работает так же эффективно. Я решил просто сохранить непрозрачность в YES и игнорировать предупреждения журнала, они, похоже, ничего не делают.)

+0

Спасибо за совет! Это единственный способ избежать этого предупреждения/сообщения об ошибке? Я имею в виду, что я использую CIContext и CIFilter (ы) для манипулирования, а CGContext в этом методе немного похож на накладные расходы. –

+0

@AdamSzabo вы все равно можете все это сделать, просто убедитесь, что ваш CGContext не непрозрачен, но имеет альфа-канал. –