Масштаб Ланцоша не работает, когда 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, если это необходимо.

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам