Как захватить UIView в UIImage без потери качества на дисплее сетчатки - PullRequest
288 голосов
/ 02 декабря 2010

Мой код работает нормально для обычных устройств, но создает размытые изображения на устройствах Retina.

Кто-нибудь знает решение моей проблемы?

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

Ответы [ 16 ]

1 голос
/ 06 июня 2018

Вот расширение Swift 4 UIView на основе ответа от @ Dima.

extension UIView {

   func image () -> UIImage?
   {
       UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)

       drawHierarchy(in: bounds, afterScreenUpdates: false)

       let image = UIGraphicsGetImageFromCurrentImageContext()

       UIGraphicsEndImageContext()

       return image
   }
}
0 голосов
/ 25 мая 2019

UIGraphicsImageRenderer - это относительно новый API, представленный в iOS 10. Вы создаете UIGraphicsImageRenderer , указывая размер точки .Метод image принимает аргумент замыкания и возвращает растровое изображение, полученное в результате выполнения переданного замыкания.В этом случае результатом будет исходное изображение, уменьшенное для рисования в указанных пределах.

https://nshipster.com/image-resizing/

Поэтому убедитесь, что размер, который вы передаете в UIGraphicsImageRendererточки, а не пиксели.

Если ваши изображения больше, чем вы ожидаете, вам нужно разделить ваш размер на коэффициент масштабирования.

0 голосов
/ 12 апреля 2016

В этом методе просто передайте объект представления, и он вернет объект UIImage.

-(UIImage*)getUIImageFromView:(UIView*)yourView
{
 UIGraphicsBeginImageContext(yourView.bounds.size);
 [yourView.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 return image;
}
0 голосов
/ 01 марта 2016
- (UIImage*)screenshotForView:(UIView *)view
{
    UIGraphicsBeginImageContext(view.bounds.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // hack, helps w/ our colors when blurring
    NSData *imageData = UIImageJPEGRepresentation(image, 1); // convert to jpeg
    image = [UIImage imageWithData:imageData];

    return image;
}
0 голосов
/ 12 февраля 2013

Иногда метод drawRect делает проблему, поэтому я получил эти ответы более подходящими.Вы тоже можете посмотреть на него Capture UIImage UIView, застрявший в методе DrawRect

0 голосов
/ 30 января 2013

Добавьте это к методу в категорию UIView

- (UIImage*) capture {
    UIGraphicsBeginImageContext(self.bounds.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self.layer renderInContext:context];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}
...