Шкала Ланцоша не работает, когда scaleKey больше некоторого значения

У меня есть этот код

CIImage * input_ciimage = [CIImage imageWithCGImage:self.CGImage];
CIImage * output_ciimage =
[[CIFilter filterWithName:@"CILanczosScaleTransform" keysAndValues:
                           kCIInputImageKey, input_ciimage,
                           kCIInputScaleKey, [NSNumber numberWithFloat:0.72], // [NSNumber numberWithFloat: 800.0 / self.size.width],
                           nil] outputImage];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef output_cgimage = [context createCGImage:output_ciimage 
    fromRect:[output_ciimage extent]];
UIImage *output_uiimage;
output_uiimage = [UIImage imageWithCGImage:output_cgimage 
    scale:1.0 orientation:self.imageOrientation];
CGImageRelease(output_cgimage);
return output_uiimage;

Итак, когда scaleKey больше некоторого значения, output_uiimage является черным изображением.

В моем случае, если значение ключа kCIInputScaleKey> @ 0.52, то результатом будет черное изображение. Когда я повернул изображение на 90 градусов, я получил тот же результат, но значение было 0,72 (а не 0,52).

Что не так с библиотекой или ошибка в моем коде?

У меня iPhone 4, iOS 7.1.2, xCode 6.0, если нужно.


person Logioniz    schedule 26.09.2014    source источник
comment
У меня эта проблема возникает на iPad Air (ios 8.0.2 xcode 6) на больших изображениях. Итак, CILanczosScaleTransform делает черное изображение с масштабом = 0,5 (размер изображения 4080x4080). На изображении размером 4096 этот фильтр каждый раз делает черное изображение. Такие же проблемы возникают с другими встроенными и настраиваемыми фильтрами. Я думаю, что у CoreImage все еще есть проблемы с большими изображениями.   -  person George    schedule 30.09.2014
comment
Возможно, потребуется сообщить об ошибке в Apple. Я не могу сделать это через свой аккаунт.   -  person Logioniz    schedule 01.10.2014
comment
да. Я сообщил об ошибке в Apple.   -  person George    schedule 01.10.2014
comment
Спасибо. Пожалуйста, держите меня в курсе.   -  person Logioniz    schedule 02.10.2014


Ответы (2)


Вот что сказала Apple:

Этот сценарий обнаруживает ошибку в Core Image. Ошибка возникает, когда для рендеринга требуется промежуточный буфер, размер которого превышает пределы текстуры графического процессора (4096), И входное изображение попадает в эти пределы. Это происходит с любым фильтром, который выполняет свертку (размытие, ланцос) на входном изображении, ширина или высота которого близки к пределу текстуры GL.
Примечание: рендеринг успешен, если один из размеров входного изображения увеличено до 4097.

Замена CILanczosScaleTransform на CIAffineTransform (более низкое качество) или изменение размера изображения с помощью компьютерной графики - возможные обходные пути для предоставленного примера кода.

person George    schedule 21.10.2014
comment
Привет, Джордж! Мы столкнулись с аналогичной проблемой во время работы над нашим продуктом. Я уверен, что ваш вклад может быть очень ценным. Есть ли шанс, что ты сможешь быстро взглянуть на это? stackoverflow.com/questions/57153640/ - person Roi Mulia; 24.07.2019

Я обновил отчет об ошибке по запросу инженеров Apple. Они отвечают:

Мы полагаем, что проблема связана с фильтром Ланцоша Core Image, который возникает при определенных масштабных коэффициентах субдискретизации. Мы надеемся исправить эту проблему в будущем.

Фильтр должен хорошо работать с субдискретизацией, равной степени 2 (т.е. 1/2, 1/4, 1/8). Поэтому мы рекомендуем ограничить масштабирование до этих значений, а затем использовать AffineTransform для дальнейшего увеличения или уменьшения, если это необходимо.

Сейчас мы закрываем этот отчет об ошибке.

person George    schedule 06.05.2015