Swift версия:

ользую следующий код для выполнения некоторых манипуляций с загруженным изображением, но нахожу, что дисплей становится размытым, когда он находится на дисплее сетчатки

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section

{
float originalWidth = image.size.width ;
float originalHeight = image.size.height ;
int w = originalWidth * section.size.width;
int h = originalHeight * section.size.height;

CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast);
CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before
CGContextTranslateCTM(ctx, (float)-originalWidth * section.origin.x, (float)-originalHeight * section.origin.y);
CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]);
CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage];

CGContextRelease(ctx);
CGImageRelease(cgImage);

return resultImage;
}

Как мне изменить это, чтобы сделать его совместимым с сетчаткой.

Заранее спасибо за вашу помощь

Бест, Д.В.

Ответы на вопрос(3)

помог мне! В любом случае, чтобы быть более понятным, код от OP должен быть изменен следующим образом:

- (UIImage*)createImageSection:(UIImage*)image section:(CGRect)section        
{
    CGFloat scale = [[UIScreen mainScreen] scale]; ////// ADD

    float originalWidth = image.size.width ;
    float originalHeight = image.size.height ;
    int w = originalWidth * section.size.width *scale; ////// CHANGE
    int h = originalHeight * section.size.height *scale; ////// CHANGE

    CGContextRef ctx = CGBitmapContextCreate(nil, w, h, 8, w * 8,CGImageGetColorSpace([image CGImage]), kCGImageAlphaPremultipliedLast);
    CGContextClearRect(ctx, CGRectMake(0, 0, originalWidth * section.size.width, originalHeight * section.size.height)); // w + h before
    CGContextTranslateCTM(ctx, (float)-originalWidth * section.origin.x, (float)-originalHeight * section.origin.y);

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale); ////// ADD

    CGContextDrawImage(ctx, CGRectMake(0, 0, originalWidth, originalHeight), [image CGImage]);
    CGImageRef cgImage = CGBitmapContextCreateImage(ctx);
    UIImage* resultImage = [[UIImage alloc] initWithCGImage:cgImage];

    CGContextRelease(ctx);
    CGImageRelease(cgImage);

    return resultImage;
}
Решение Вопроса

поэтому вы должны сделать это самостоятельно.

Для этого вам нужно умножить все ваши координаты и размеры, которые используются в подпрограммах CoreGraphics, на входное изображениеscale свойство (которое будет 2.0 на устройствах Retina), чтобы гарантировать, что вы делаете все свои манипуляции в двойном разрешении.

Тогда вам нужно изменить инициализациюresultImage использоватьinitWithCGImage:scale:orientation: и введите тот же масштабный коэффициент. Это то, что заставляет устройства Retina отображать вывод в собственном разрешении, а не в пиксельном разрешении.

 DKV20 янв. 2011 г., 16:52
Спасибо! Этот метод решил мою проблему!
 epologee18 нояб. 2011 г., 23:15
Извините, слишком быстро с комментарием и слишком поздно для редактирования. Если вы делаете это так, вам не нужно думать о масштабировании всех координат самостоятельно:CGFloat scale = [[UIScreen mainScreen] scale]; CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale);
 epologee18 нояб. 2011 г., 20:44
Если вы измените CTM (текущую матрицу преобразования) вашего контекста, вызвавCGContextScaleCTM(UIGraphicsGetCurrentContext(), 2, 2)Вам не нужно вручную умножать свои координаты, вы можете просто нарисовать то же самое, что и с изображениями без сетчатки.
 Hlung14 февр. 2014 г., 19:15
Тем не менее, придется вручную фиксировать масштаб, если вы рисуете только часть (подпункт) внутри этого изображения.
 GoldenJoe27 сент. 2013 г., 23:05
Так много да. Отличное решение.

Swift версия:

    let scale = UIScreen.mainScreen().scale

    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale)

Ваш ответ на вопрос