CoreGraphics для отображения сетчатки
Я использую следующий код для выполнения некоторых манипуляций с загруженным изображением, но обнаружил, что дисплей становится размытым, когда он находится на экране сетчатки.
- (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;
}
Как изменить это, чтобы сделать его сетчатым.
Заранее благодарим за помощь
Бест,
DV
Ответы
Ответ 1
CGImages не учитывают Retina-ness вашего устройства, поэтому вы должны сделать это самостоятельно.
Для этого вам нужно умножить все ваши координаты и размеры, которые используются в подпрограммах CoreGraphics, с помощью свойства входного изображения scale
(которое будет равно 2.0 на устройствах Retina), чтобы обеспечить выполнение всех ваших действий с двойным разрешением.
Затем вам нужно изменить инициализацию resultImage
, чтобы использовать initWithCGImage:scale:orientation:
и ввести тот же масштабный коэффициент. Это то, что делает устройства Retina рендерингом вывода в собственном разрешении, а не в пиксельном удвоении.
Ответ 2
Спасибо за ответ, помог мне! Во всяком случае, чтобы быть яснее, код 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;
}
Ответ 3
Быстрая версия:
let scale = UIScreen.mainScreen().scale
CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale)