Форум программистов, компьютерный форум CyberForum.ru

Картинки в NORETINA устройствах - Objective-C

Восстановить пароль Регистрация
 
noname_club
 Аватар для noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 575
04.08.2013, 11:19     Картинки в NORETINA устройствах #1
Думаю некоторые сталкивались с тем что обычные устройства не умеют правильно интерполировать(сгладить) изображение, если они превышает размеры своего контейнера.

Если на retina с этим делом все "хорошо".

То на обычном iphone можно увидеть вот такую картинку

Картинки в NORETINA устройствах
верхнее изображение без обработки.
для нижнего применено программное сглаживание

Результат очевиден: картинка со сглаживаем выглядит лучше.

Осталось выяснить как это "сглаживание" делается

объявим две глобальные фукнции:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// private functions
 
// use frameworks:
// #import <QuartzCore/QuartzCore.h>
 
UIImage* sys_objAntiAlias(UIImage*img, CGSize size) {
    
    UIGraphicsBeginImageContext(size);
    [img drawInRect:CGRectMake( 0 , 0  , size.width , size.height ) ];
    CGContextSetInterpolationQuality( UIGraphicsGetCurrentContext() , kCGInterpolationHigh );
    
    img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return img;
}
 
void sys_objAntiAliasAfter(id obj) {
 
    [obj layer].shouldRasterize = NO;
    [obj layer].rasterizationScale = 1;
    [obj layer].edgeAntialiasingMask = -1;
    [obj setClipsToBounds:YES];
    [obj layer].masksToBounds = YES;
}
использование

Objective-C
1
2
3
4
5
6
7
8
9
// autolayuot отключен!
-(void)viewWillAppear:(BOOL)animated {
    
    UIImage *newimage = sys_objAntiAlias(_myimg2.image, _myimg2.frame.size);
    
    _myimg2.image = newimage;
    
    sys_objAntiAliasAfter(_myimg2);
}
так как retina устройства не требуют данной обработки изображений, то объявим макрос retina детектора

Objective-C
1
#define isRetina ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] > 1.1f)
и будем проверять, и в случае отсутствия retina экрана на устройстве, будем применять сглаживания

Objective-C
1
2
3
4
5
6
7
8
9
-(void)viewWillAppear:(BOOL)animated {
    if (!isRetina) {
        UIImage *newimage = sys_objAntiAlias(_myimg2.image, _myimg2.frame.size);
        
        _myimg2.image = newimage;
        
        sys_objAntiAliasAfter(_myimg2);
    }
}

данный код является сырым полуфабрикатом, дальнейшие подробности правильного использования в проектах и другие возможности применения сглаживания будут раскрыты в ходе обсуждения.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2013, 11:19     Картинки в NORETINA устройствах
Посмотрите здесь:

OpenGL glut на других устройствах
Delphi Информация о ситовых устройствах
Информация о системе и устройствах PascalABC.NET
CCSprite не отображает перезаписанный файл картинки Objective-C
Проверка значения и отображение картинки по результату Objective-C
Android Не создается БД на некоторых устройствах
Objective-C Кнопка из картинки
Двигатели в устройствах
Парсинг информации об устройствах
Шрифт на мобильных устройствах Drupal
HTML, CSS Hover на touch устройствах
Маштабирование картинки на разных Android-устройствах Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 22:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru