Как уменьшить изображение в iOS, сглаженное, но не мягкое? - PullRequest
6 голосов
/ 02 февраля 2012

Я пробовал популярную категорию UIImage + Resize с различными настройками интерполяции. Я пробовал масштабирование с помощью методов CG и CIFilters. Однако я никогда не смогу получить уменьшенное изображение, которое не выглядит ни слегка мягким в фокусе, ни полным зазубренных артефактов. Есть ли другое решение или сторонняя библиотека, которая позволила бы мне получить очень четкое изображение?

Это должно быть возможно на iPhone, потому что, например, приложение «Фотографии» будет показывать четкое изображение даже при нажатии, чтобы уменьшить его.

Ответы [ 4 ]

6 голосов
/ 16 февраля 2012

Вы сказали CG, но не указали свой подход.

Использование контекста рисования или растрового изображения:

CGContextSetInterpolationQuality(gtx, kCGInterpolationHigh);
CGContextSetShouldAntialias(gtx, true); << default varies by context type
CGContextDrawImage(gtx, rect, image);

и убедитесь, что ваши виды и их слои не меняют размер изображения снова. У меня были хорошие результаты с этим. Возможно, другие взгляды влияют на ваш взгляд или контекст. Если это выглядит не очень хорошо, попробуйте сделать это отдельно, чтобы проверить, не искажает ли что-то ваше представление / изображение.

Если вы рисуете в растровом изображении, вы создаете растровое изображение с заданными размерами, а затем рисуете в нем.

В идеале вы должны поддерживать соотношение сторон.

Также обратите внимание, что это может быть довольно ресурсоемким - многократное рисование / масштабирование в HQ будет стоить много времени, поэтому вы можете вместо этого создать копию с измененным размером (используя CGBitmapContext).

4 голосов
/ 17 февраля 2012

Вот рутина, которую я написал для этого. Есть немного мягкого фокуса, хотя в зависимости от того, как далеко вы масштабируете исходное изображение, это не так уж плохо. Я масштабирую программные снимки экрана.

- (UIImage*)imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize {

    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}
0 голосов
/ 16 февраля 2012

Когда изображение уменьшено, часто рекомендуется применить повышение резкости.

Проблема в том, что Core Image на iOS (пока) не реализует фильтры повышения резкости (CISharpenLuminance, CIUnsharpMask), так что вам придется кататься самостоятельно.Или Apple, пока они не реализуют эти фильтры на iOS.

Тем не менее, Sharpen luminance и Unsharp mask являются довольно продвинутыми фильтрами, и в предыдущих проектах я обнаружил, что даже простое ядро ​​3x3 будет производить ясно видимое и удовлетворительноеРезультаты.

Следовательно, если вам хочется работать на уровне пикселей, вы можете получить данные изображения из графического контекста, немного замаскировать свой путь к значениям R, G и B и кодировать графику, как в 1999 году. будет все равно что заново изобретать колесо.

Может быть, есть несколько стандартных графических библиотек, которые тоже могут это сделать (ImageMagick?)

0 голосов
/ 16 февраля 2012

CGContextSetInterpolationКачество - это то, что вы ищете.

Вам следует попробовать дополнения этой категории http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

...